迴圈佇列(JSU-ZJJ)
阿新 • • 發佈:2019-01-04
題目描述
根據給定的空間構造順序迴圈佇列,規定隊滿處理方法為少用一個元素空間。例如,給定5個元素空間構造迴圈佇列,則只能存放4個元素。試根據入隊及出隊操作判斷佇列最後的元素存放情況,並輸出最後佇列中的元素值,即完成給定入隊及出列操作後一次性全部出隊的元素值。要求採用順序佇列完成。
輸入
輸入的第一行為一個自然數n,表示要求構造的順序迴圈佇列空間數。第二行為操作次k,接下來k行為出隊入隊操作,每行各代表一次操作。入隊用in表示,出隊用out表示,如果是入隊,則in隔一空格後為一整數,表示入隊元素值。
輸出
輸出完成所有入隊出隊操作後,一次性出隊元素。用一個空格隔開。可以假定隊在完成所有操作後不為空。
樣例輸入 Copy
4
7
in 1
in 2
in 5
in 6
out
out
in 8
樣例輸出 Copy
5 8
分析:
本題的話是考察迴圈佇列的應用。一開始,我以為佇列滿了,就覆蓋第一個。後來發現不是這樣的,他是如果佇列滿了,在遇到IN 就不要放進去了。
所以本題在PUSH時,要判斷佇列是否滿了。然後本題的資料水了,IN 後面接的都是一位數的數字。
#include"stdio.h" #include"string.h" #define MAX_SIZE 10000 typedef struct { int data[MAX_SIZE]; int front; int rear; }SqQueue; SqQueue Q; int N; void PUSH(int digit) { if((Q.rear+1)%N!=Q.front) {Q.data[Q.rear]=digit; Q.rear++; } } void POP() { Q.front++; } int main() { int k,i,digit; char a[10],T; while(~scanf("%d",&N)) { Q.front=0; Q.rear=0; scanf("%d",&k); scanf("%c",&T); for(i=1;i<=k;i++) { gets(a); if(a[0]=='i') { digit=a[3]-'0'; PUSH(digit); } else { POP(); } } if(Q.front>Q.rear) {for(i=Q.front;i<N-1;i++) printf("%d ",Q.data[i]); for(i=0;i<Q.rear-1;i++) printf("%d ",Q.data[i]); printf("%d\n",Q.data[i]); } else { for(i=Q.front;i<Q.rear-1;i++) printf("%d ",Q.data[i]); printf("%d\n",Q.data[i]); } } }