栈和队列
卡片游戏
桌面上有一叠牌,从第一张牌开始从上往下一次编号为1-n.当至少还剩下两张牌时进行一下操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的最后。输入n,输出每次扔掉的牌,以及最后剩下的牌。
样例输入:7
样例输出:1 3 5 7 4 2 6
1 #include "stdafx.h" 2 #include<iostream> 3 using namespace std; 4 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 int num[100]; 8 int inputNum; 9 cin>>inputNum; 10 for(int i = 1;i<=inputNum;++i) 11 { 12 num[i-1]=i; 13 } 14 int renum=0;//用于记录输出字数 15 int curnum=0; 16 int len = inputNum-1; 17 while(renum!=inputNum) 18 { 19 cout<<num[curnum]<<" "; 20 curnum++; 21 len++; 22 num[len]=num[curnum]; 23 curnum++; 24 renum++; 25 } 26 return 0; 27 }
运行结果没有错误,但是存在bug.像用curnum记录当前的下标. 最后会达到2倍inputNum的大小,也就是说可能运行到后期,会读写非法内存,除非把数组空间开大或者才去一种称为循环队列的技术.
1 #include "stdafx.h" 2 #include<iostream> 3 #include<queue> 4 using namespace std; 5 6 queue<int> q; 7 int _tmain(int argc, _TCHAR* argv[]) 8 { 9 int n; 10 cin>>n; 11 for(int i = 0;i!=n;++i) q.push(i+1); 12 while(!q.empty()) 13 { 14 cout<<q.front()<<endl; 15 q.pop(); 16 if(q.empty()) 17 { 18 break; 19 } 20 q.push(q.front()); 21 q.pop(); 22 } 23 return 0; 24 }
这就是STL队列.