双向队列

来源:互联网 发布:俄罗斯 核武 知乎 编辑:程序博客网 时间:2024/05/01 09:16
将头和尾的初始值开大一些,否则会出现数组越界问题
#include<iostream>#include<algorithm>#include<string>using namespace std;const int maxn=100000+10;typedef struct{    int *data;    int frot, rear;}Queue;void initqueue(Queue &q)///队列初始化{    q.data=new int [maxn];    q.frot=10001;    q.rear=10000;}void display(Queue &q)///从头到尾输出元素数据{    for(int i=q.frot;i<=q.rear;i++)    {        if(i==q.frot)            cout<<q.data[i];        else cout<<" "<<q.data[i];    }    cout<<endl;}void renqueue(Queue &q, int key)///右进队{    q.data[++q.rear]=key;}void lenqueue(Queue &q, int key)///左进队{    q.data[--q.frot]=key;}void del(Queue &q, int k)///删除k位置上的元素{    q.frot++;    for(int i=q.frot+k-2;i>=q.frot;i--)        q.data[i]=q.data[i-1];}void rdequeue(Queue &q)///右出队{    q.rear--;}void ldequeue(Queue &q)///左出队{    q.frot++;}int empqueue(Queue &q){    if(q.rear<q.frot-1)    {        return 1;    }    return 0;}int judge[maxn];int main(){    ios::sync_with_stdio(false);    Queue q;    initqueue(q);    int T;    cin>>T;    int num=1;    int flag;    int n=1;    while(T--)    {        flag=0;        string s;        cin>>s;        if(s=="LIN")        {            int x;            cin>>x;            lenqueue(q, x);   ///         display(q);        }        else if(s=="RIN")        {            int k;            cin>>k;            renqueue(q, k);    ///        display(q);        }        else if(s=="ROUT")        {            rdequeue(q);            flag=empqueue(q);            if(flag)            {                judge[n]=num;                n++;                q.rear++;            }    ///        display(q);        }        else if(s=="LOUT")        {            ldequeue(q);            flag=empqueue(q);            if(flag)            {                judge[n]=num;                n++;                q.frot--;            }    ///        display(q);        }        num++;    }    display(q);    for(int i=1;i<n;i++)        cout<<judge[i]<<" ERROR"<<endl;    return 0;}

0 0