队列就像排队一样,先进先出。元素从队尾入队,rear+1。要从队首弹出元素,front+1。要注意不论是rear还是front都只是一个数组的下标(手工栈)。比如进一个元素x入队,q[++rear]假如rear是0,等于把x的值赋给q1了,再把y的值赋给q2,这样一个q1=x,q2=y的队列就形成了,把元素弹出队列的时候只需++front就行了,因为front和rear共用一个下标。
比如下面这个,push是写一个数入队,pop是弹一个数出队,query是查询队首第k个元素。
#include<bits/stdc++.h>
using namespace std;
int x,k,q[100001],front=1,rear=0;
char str[100001];
int main()
{
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%s",str);
if(str[2]=='s') //就是push
{ scanf("%d",x)
q[++rear]=x; //从队尾进队
}
else if(str[1]=='o')//就是pop删除
{
++front;/*队首元素出队,我觉得其实不是不存在了,用str[1]还是能调出来,只不过不在队首和队尾之间了。*/
}
else//就是查询队首第几个元素
{
scanf("%d",k);
printf("%d\n",q[front+x-1]); //想不清楚可以用第一个元素来验证
}
}
}
这个是先把x入队,再把2x和2x+1入队,显示x,然后弹出x。这样进行k次。
#include<bits/stdc++.h>
using namespace std;
int x,k,q[200002],front=1,rear=0;
int main()
{
scanf("%d%d",&x,&k);
q[++rear]=x; //x入队
for(int i=1;i<=k;i++)
{
q[++rear]=2*q[front];
q[++rear]=2*q[front]+1; //2x和2x+1分别入队
printf("%d",q[front]);
++front; //弹出队首元素
}
}
队列和操作方法的不同的实现我觉得是因为,变量像水,栈像一个有底的杯子,只用一个变量top表示从杯口取出就行了,而队列像一个管子,需要用一个变量front表示进水口,另一个rear表示出水口。
感觉好像找到了学习编程一点方法,不知道感觉对不对,反正一直走下去不会错。只要一直向前,世上就没有弯路。