1. 程式人生 > >資料結構與演算法題目集7-22——堆疊模擬佇列

資料結構與演算法題目集7-22——堆疊模擬佇列

我的資料結構與演算法題目集程式碼倉: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++解題報告: