双向队列
題目描述
? ? ? 想想雙向鏈表……雙向隊列的定義差不多,也就是說一個隊列的隊尾同時也是隊首;兩頭都可以做出隊,入隊的操作。
現在給你一系列的操作,請輸出最后隊列的狀態;
命令格式:
LIN?X??X表示一個整數,命令代表左邊進隊操作;
RIN?X??表示右邊進隊操作;
ROUT
LOUT???表示出隊操作;
輸入
第一行包含一個整數M(M<=10000),表示有M個操作;
以下M行每行包含一條命令;
命令可能不合法,對于不合法的命令,請在輸出中處理;
輸出
輸出的第一行包含隊列進行了M次操作后的狀態,從左往右輸出,每兩個之間用空格隔開;
以下若干行處理不合法的命令(如果存在);
對于不合法的命令,請輸出一行X?ERROR
其中X表示是第幾條命令;
示例輸入
8 LIN 5 RIN 6 LIN 3 LOUT ROUT ROUT ROUT LIN 3示例輸出
37 ERROR
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef int QElemType; typedef int Status; typedef struct QNode {QElemType data;QNode *next; } QNode, *Queueptr; typedef struct {Queueptr front;Queueptr rear; } LinkQueue;Status InitQueue (LinkQueue &q)//隊的初始化; {q.front=q.rear=(Queueptr)malloc(sizeof(QNode));if(!q.front) exit(0);q.front->next=NULL;return 1; } Status EnQueuer(LinkQueue &q, QElemType e)//從隊尾進隊; {Queueptr p;p=(Queueptr)malloc(sizeof(QNode));if(!p) exit(0);p->data=e;p->next = NULL;q.rear->next=p;q.rear=p;return 1; }void EnQueuel(LinkQueue &q, QElemType e)//從左插入元素相當于逆序建鏈表從對頭進隊; {Queueptr p1, p2;p1=(Queueptr)malloc(sizeof(QNode));if(!p1) exit(0);p1->data=e;if(q.front==q.rear)q.front->next=NULL;p1->next = q.front->next;q.front->next = p1;p2=q.front;while(p2->next!=NULL){p2=p2->next;}q.rear=p2; }void DeQueuer (LinkQueue &q)//從隊尾方向的出隊; {Queueptr p1, p2;if (q.front == q.rear)exit(0);p1=q.rear;p2=q.front;while(p2->next!=q.rear)//指向隊尾的前一個元素{p2=p2->next;}p2->next=p1->next;q.rear = p2;free(p1); }Status DeQueuel (LinkQueue &q)//從隊頭出隊; {Queueptr p;if (q.front == q.rear)return 0;p = q.front->next;q.front->next = p->next;if (q.rear == p)q.rear = q.front;free (p);return 1; }int main() {int m, i, num, a[10010], j=0;char c[5];LinkQueue q;InitQueue(q);scanf("%d", &m);for(i=1; i<=m; i++){scanf("%s", c);if(strcmp(c,"LIN")==0){scanf("%d", &num);EnQueuel(q, num);//隊頭進隊}if(strcmp(c,"RIN")==0){scanf("%d", &num);EnQueuer(q, num);//隊尾進隊;}if(strcmp(c,"LOUT")==0){if(q.front == q.rear)a[j++]=i;//計入不合法的命令;elseDeQueuel(q);}if(strcmp(c,"ROUT")==0){if(q.front == q.rear)a[j++]=i;//計入不合法的命令;elseDeQueuer(q);}}Queueptr p;p=q.front->next;while(p)//隊元素的輸出;{if(p->next!=NULL)printf("%d ", p->data);elseprintf("%d\n", p->data);p=p->next;}if(j){for(i=0; i<j; i++)printf("%d ERROR\n",a[i]);} }
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int main() {int n,i,j,x,l=0,m=0;int a[100000],b[100000];//a數組是模擬隊的數組計入隊的元素,b數組計入不合法的命令;char str[100];scanf("%d",&n);for(i=0;i<n;i++){scanf("%s",str);if(str[0]=='R'){if(str[1]=='I'){scanf("%d",&x);a[l++]=x;}else if(str[1]=='O'){if(l>0)l--;elseb[m++]=i+1;}}if(str[0]=='L'){if(str[1]=='I'){scanf("%d",&x);l++;for(j=l-1;j>0;j--)a[j]=a[j-1];a[0]=x;}else if(str[1]=='O'){if(l>0){for(j=0;j<l-1;j++)a[j]=a[j+1];l--;}elseb[m++]=i+1;}}}for(i=0;i<l;i++){if(i==l-1)printf("%d",a[i]);elseprintf("%d ",a[i]);}printf("\n");for(i=0;i<m;i++)printf("%d ERROR\n",b[i]);return 0; }
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 数据结构实验之栈七:出栈序列判定
- 下一篇: 算术表达式的转换