3-08. 栈模拟队列(25)(ZJU_PAT 模拟)
主題鏈接:http://pat.zju.edu.cn/contests/ds/3-08
設已知有兩個堆棧S1和S2,請用這兩個堆棧模擬出一個隊列Q。
所謂用堆棧模擬隊列,實際上就是通過調用堆棧的下列操作函數:
(1) int IsFull(Stack S):推斷堆棧S是否已滿,返回1或0;
(2) int IsEmpty (Stack S ):推斷堆棧S是否為空,返回1或0。
(3) void Push(Stack S, ElementType item ):將元素item壓入堆棧S;
(4) 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行。
例子輸入與輸出:
| 序號 | 輸入 | 輸出 |
| 1 | 2 2 A 1 A 2 D D T | 1 2 |
| 2 | 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 |
PS:
個人認為題意有點難理解!反正我是理解了好久!
代碼例如以下:
#include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <stack> using namespace std; stack<int>s1;//容量小的棧 stack<int>s2;//容量大的棧 int main() {int n1, n2;char c;while(~scanf("%d%d",&n1,&n2)){if(n1 > n2){int t = n1;n1 = n2;n2 = n1;}getchar();int tt;int flag = 0;for(int i = 0; ; i++){scanf("%c",&c);if(c == 'T')//結束輸入break;if(c == 'A'){scanf("%d",&tt);if(s1.size()==n1 && s2.size()!=0)//假設棧s1滿且棧s2不為空,則隊滿{printf("ERROR:Full\n");continue;}if(s1.size()!=n1)//假設棧s1沒有滿,直接壓入s1.push(tt);else{int len = s1.size();//假設棧s1滿。把棧s1的全部元素彈出壓入s2for(int i = 0; i < len; i++){int t = s1.top();s1.pop();s2.push(t);}s1.push(tt);//壓入s1}}else if(c == 'D'){if(s1.size()==0 && s2.size()==0){printf("ERROR:Empty\n");continue;}if(s2.size() == 0)//若棧s2空就將s1中的全部元素彈出到棧s2中,然后出棧{int len = s1.size();for(int i = 0; i < len; i++){int t = s1.top();s1.pop();s2.push(t);}}printf("%d\n",s2.top());s2.pop();}}}return 0; }
版權聲明:本文博主原創文章,博客,未經同意不得轉載。
轉載于:https://www.cnblogs.com/bhlsheji/p/4887299.html
總結
以上是生活随笔為你收集整理的3-08. 栈模拟队列(25)(ZJU_PAT 模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络之网络概述:1、基本概念
- 下一篇: 汉诺塔 hanoi 如此简单