• 约瑟夫环的两种实现


     

    方法一:用一个数组存放每个元素,再用一个bool数组存放每个元素是否还在那个队列中。每次出列一个元素,将其对应的那个bool值置为false。循环输出第m个元素直到只剩下一个元素在队列中。不过这个时间复杂度比较高。

     

    #include<iostream>
    using namespace std;
    //时间复杂度高的方法
    #define MAX_LENGTH 50
    int data[MAX_LENGTH];
    bool isInQueue[MAX_LENGTH];
    void main()
    {
    	int num;  //每次数的个数
    	cin>>num;
    
    	int temp;
    	int currentCount=0;
    	while(cin>>temp)//初始化队列
    	{
    		if(currentCount<MAX_LENGTH)
    		{
    			data[currentCount]=temp;
    			isInQueue[currentCount++]=true;
    		}
    		else
    			break;
    	}
    	
    
    
    	int count=currentCount;//记录当前队列中的元素个数
    	int start=0;//每次开始数数的第一个位置
    	while(count>1)
    	{
    		int i=start;//每次数数的迭代
    		int j=0;
    		int out=0;
    		for(i;i<currentCount;i=(i+1)%currentCount)
    		{
    			if(isInQueue[i])
    				++j;
    			if(j==num)
    			{
    				out=i;
    				cout<<data[out]<<" ";
    				isInQueue[out]=false;
    				--count;
    				while(!isInQueue[out])
    					out=(out+1)%currentCount;// 找到下个开始数数的位置
    				start=out;
    				break;
    			}
    
    		}
    	}
    	cout<<data[start]<<endl;//数出剩下的那个数
    }


     

    方法二:空间换时间,每个元素封装成一个结构体。因为链表的特殊性,方便我们删除操作和逐个快速遍历。

     

    #include<iostream>
    using namespace std;
    //空间换时间的方法
    struct Node
    {
    	Node(int v,Node* n=NULL):value(v),next(n){}
    	int value;
    	Node* next;
    };
    
    Node* initList()//建立链表,记录每个元素
    {
    	Node* head=NULL;
    	Node* rear=NULL;
    	int temp;
    	while(cin>>temp)
    	{
    		if(!head)
    		{
    			head=new Node(temp);
    			rear=head;
    		}
    		else
    		{
    			Node* node=new Node(temp,head);
    			rear->next=node;
    			node->next=head;
    			rear=node;
    		}		
    	}
    	return head;
    }
    
    void outQueue(Node* head,int num)//出队列
    {
    	int i=0;
    	Node* last=NULL;
    	Node* temp=head;
    	while(temp!=temp->next)
    	{
    		++i;
    		if(i==num)
    		{
    			cout<<temp->value<<" ";
    			i=0;
    			last->next=temp->next;
    			delete temp;
    			temp=last->next;
    		}
    		else
    		{
    			last=temp;
    			temp=temp->next;
    		}
    		
    	}
    	cout<<temp->value<<endl;
    	if(temp==head)
    		cout<<"yiyang";
    }
    void main()
    {
    	int num;
    	cin>>num;
    	Node* pHead=initList();
    	outQueue(pHead,num);
    }
    


  • 相关阅读:
    PPTP服务器的端口
    Linux ln命令
    Git 学习笔记回到过去版本
    Iptables中SNAT和MASQUERADE的区别
    转移虚拟机后ubuntu network available SIOCSIFADDR: No such device
    用iptables做IP的静态映射
    软件项目管理
    需求工程
    软件工程——理论、方法与实践 之 软件实现
    软件工程——理论、方法与实践 之 软件工程中的形式化方法
  • 原文地址:https://www.cnblogs.com/pangblog/p/3327321.html
Copyright © 2020-2023  润新知