7-22 堆棧模擬隊列 (25分)


設已知有兩個堆棧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()

輸入格式:

輸入首先給出兩個正整數N1N2,表示堆棧S1S2的最大容量。隨后給出一系列的隊列操作: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];
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM