設已知有兩個堆棧S1和S2,請用這兩個堆棧模擬出一個隊列Q。
所謂用堆棧模擬隊列,實際上就是通過調用堆棧的下列操作函數:
int IsFull(Stack S)
:判斷堆棧S
是否已滿,返回1或0;int IsEmpty (Stack S )
:判斷堆棧S
是否為空,返回1或0;void Push(Stack S, ElementType item )
:將元素item
壓入堆棧S
;ElementType Pop(Stack S )
:刪除並返回S
的棧頂元素。
實現隊列的操作,即入隊void AddQ(ElementType item)
和出隊ElementType DeleteQ()
。
輸入格式:
輸入首先給出兩個正整數N1
和N2
,表示堆棧S1
和S2
的最大容量。隨后給出一系列的隊列操作:A item
表示將item
入列(這里假設item
為整型數字);D
表示出隊操作;T
表示輸入結束。
輸出格式:
對輸入中的每個D
操作,輸出相應出隊的數字,或者錯誤信息ERROR:Empty
。如果入隊操作無法執行,也需要輸出ERROR:Full
。每個輸出占1行。
輸入樣例:
3 2
A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T
輸出樣例:
ERROR:Full 1 ERROR:Full 2 3 4 7 8 ERROR:Empty
首先保證棧1是空間小的那個棧,棧2是空間大的那個棧,入隊操作實際就是往棧1壓棧,出隊就是從棧2彈棧,隊滿的情況包括棧1滿且棧2不空,哪怕棧2只有一個元素,可以仔細捋捋為什么。隊空包括兩個棧都空。
代碼:
#include <cstdio> #include <iostream> using namespace std; int n1,n2,d; char s[2]; int s1[1000],s2[1000],c1,c2; int main() { scanf("%d%d",&n1,&n2); if(n1 > n2) swap(n1,n2); while(scanf("%s",s) && s[0] != 'T') { if(s[0] == 'A') { scanf("%d",&d); if(c1 == n1) { printf("ERROR:Full\n"); } else s1[c1 ++] = d; } else { if(c2) printf("%d\n",s2[-- c2]); else if(c1) { while(c1) s2[c2 ++] = s1[-- c1]; printf("%d\n",s2[-- c2]); } else printf("ERROR:Empty\n"); } if(!c2 && c1 == n1) { while(c1) s2[c2 ++] = s1[-- c1]; } } }