第十九天 队列的逻辑 队列栈区别

        队列就像排队一样,先进先出。元素从队尾入队,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表示出水口。 

感觉好像找到了学习编程一点方法,不知道感觉对不对,反正一直走下去不会错。只要一直向前,世上就没有弯路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值