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()。
輸入格式:
輸入首先給出兩個正整數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
二:思路
這個題是創建兩個棧,然后設置棧的容量,往棧的容量小的那個容器當中存入數據,
當其達到容量時,就將其中的數據轉到另一個容器當中,
當其又達到容量時,判斷 另一容器是否又元素 ,若有則輸出 FULL;
輸出時是從容量大的輸出的 ,若其為空 則將容量小容器當中的元素 輸到 容量大的容器當中,若都為空則輸出Empty
三:上碼
#include<bits/stdc++.h> using namespace std;int main() {int N1,N2;cin >> N1 >> N2; getchar();//除去換行符 stack<int>s1,s2;int temp = N1 < N2 ? N1:N2;char str;int num;while(1){cin >> str;if( str == 'T')break;if( str == 'A') {cin >> num;if(s1.size() == temp && !s2.empty()){cout << "ERROR:Full" << endl;}if(s1.size() == temp && s2.empty()){while(!s1.empty()){int num1 = s1.top();s1.pop();s2.push(num1);} }if(s1.size() < temp){s1.push(num); } } if(str == 'D'){if( s2.empty() && !s1.empty() ){while(!s1.empty()){int num2 = s1.top();s1.pop();s2.push(num2);} }if(!s2.empty()){ cout << s2.top() << endl;s2.pop(); }else if( s1.empty() && s2.empty() ) {cout << "ERROR:Empty" << endl;} } } return 0; }//3 3 //A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T另一個碼 測試數據沒問題 就是過不去 把測試帶點當中的 等容的 等都沒問題(可能跟輸入有關 ) 但還是很氣憤 本想著簡單著呢 寫完后一提交就是過不去 ,結果測試各種數據沒問題 迷茫 上網比較 了一下 覺得輸入可能有問題 改了 就通過了 但我自己做的時候 還是覺得第一遍也沒毛病呀 也上個碼吧
#include<bits/stdc++.h> using namespace std;int main() {int N1,N2;cin >> N1 >> N2; getchar();//除去換行符 stack<char>s1,s2;string str;getline(cin,str);int temp = N1 < N2 ? N1:N2;for( int i = 0; i < str.size(); i=i+2 ){if(str[i] == 'A' && s1.size() == temp && !s2.empty()){cout << "ERROR:Full" << endl;}if( str[i] == 'A'){i++;//下一個是空格 i++;//再下一個才是數字 if(s1.size() == temp && s2.empty()){while(!s1.empty()){char num = s1.top();s1.pop();s2.push(num);} }if(s1.size() < temp){ s1.push(str[i]); }} if( str[i] == 'D' ){if( s2.empty() && !s1.empty() ){while(!s1.empty()){char num = s1.top();s1.pop();s2.push(num);} }if(!s2.empty()){ cout << s2.top() << endl;s2.pop(); }else if( s1.empty() && s2.empty() ) {cout << "ERROR:Empty" << endl;} }if( str[i] == 'T')return 0;//結束程序 } }//3 3 //A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T補充:關于第二個碼 當中的設置棧的數據類型 我改過 int 類型了 還是過不去!
老樣子 加油陌生的你 ,菜鳥努力努力努力努力 成 大佬
總結
以上是生活随笔為你收集整理的7-22 堆栈模拟队列 (25 分)(详解夹思路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为荣耀手机中花粉论坛打开方法
- 下一篇: siri中文版现世,简单的4个步骤就能实