資料結構與演算法題目集7-22——堆疊模擬佇列
阿新 • • 發佈:2018-12-05
我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set
原題連結:https://pintia.cn/problem-sets/15/problems/837
題目描述:
知識點:棧、佇列
思路:雙棧實現佇列
設定兩個棧stack1和stack2,其容量分別是N1和N2,且滿足N1 <= N2。
入棧操作如下:
(1)如果stack1未滿,則將新元素壓入stack1中。
(2)如果stack1滿了且stack2為空,將stack1中的元素倒壓入stack2中,由於N1 <= N2,我們不必擔心stack2容量不夠的問題。將新元素壓入stack1中。
(3)如果stack1滿了且stack2不為空,說明此時已滿,無法壓入新元素,輸出"ERROR:Full"。
出棧操作如下:
(1)如果stack2不為空,彈出stack2的棧頂元素。
(2)如果stack2為空且stack1不為空,則將stack1中的元素倒壓入stack2中,再彈出stack2的棧頂元素。
(3)如果stack2為空且stack1也為空,說明此時無任何元素,輸出"ERROR:Empty"。
時間複雜度和輸入的資料規模及操作有關。空間複雜度是O(N1 + N2)。
C++程式碼:
#include<iostream> #include<string> #include<stack> using namespace std; int main() { int N1, N2; cin >> N1 >> N2; if(N1 > N2) { //確保N1 <= N2 int temp = N1; N1 = N2; N2 = temp; } string str1, str2; stack<string> stack1, stack2; //stack1的容量為N1,stack2的容量為N2 while(true) { cin >> str1; if(str1[0] == 'T') { break; } else if(str1[0] == 'A') { cin >> str2; if(stack1.size() < N1) { stack1.push(str2); } else if(stack1.size() == N1 && stack2.empty()) { while(!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } stack1.push(str2); } else if(stack1.size() == N1 && !stack2.empty()) { cout << "ERROR:Full" << endl; } } else if(str1[0] == 'D') { if(!stack2.empty()) { cout << stack2.top() << endl; stack2.pop(); } else { if(stack1.empty()) { cout << "ERROR:Empty" << endl; } else { while(!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } cout << stack2.top() << endl; stack2.pop(); } } } } return 0; }
C++解題報告: