棧混洗


棧混洗的概念

A中的元素經S的中轉后壓入B中,其間,只允許從A彈出壓入S或者從S彈出壓入BA中元素全部轉移到B中即完成一次棧混洗操作

棧混洗的甄別

對於這個問題主要就是模擬一次棧混洗來解決,即每次S.pop()之前檢測S是否已空,或需要彈出的元素在S中卻不是頂元素

代碼實現

#include "../head.h"
#include <stack>

bool stackPermutation(stack<int> &A, stack<int> &B) {
	stack<int> S, temp;
	while (!B.empty()) {
		temp.push(B.top());
		B.pop();
	}
	while (!A.empty()) {
		S.push(A.top());
		A.pop();
		if (temp.top() == S.top()) {
			temp.pop();
			S.pop();
			while (!S.empty()) {
				if (temp.top() == S.top()) {
					temp.pop();
					S.pop();
				}
				else return false;
			}
		}
	}
	return S.empty();
}


int main(int argc, char** argv) {
	stack<int> a, b;
	int ta, tb;
	cout << "the base stack [--->: [";
	while (cin >> ta)
		a.push(ta);
	if (cin.eof())
		cout << "endoffile";
	cin.clear();
	cout << endl;
	cout << "the test stack [--->: [";
	while (cin >> tb)
		b.push(tb);
	if (stackPermutation(a, b)) 
		cout << "true" << endl;
	else cout << "false" << endl;
	return 0;
}

stackPermutation()函數的邏輯是先將待測試棧B一個個彈出到一個臨時棧temp中,此時temp的棧頂就是原來B的棧底,這樣就可以比較容易的來模擬一次棧混洗(因為標准庫的棧容器沒有下標運算符,只能出此下策),接下來以A非空為判斷標准,一次一個的將元素彈出並壓入S中,然后把temp的棧頂元素與剛壓入S的元素(剛壓入嘛,肯定是棧頂)相比較,如果相同,tempS同時彈出這個相同的元素,接下來如果S是非空,則說明接下來S的每個元素與temp的元素相同且一一對應,所以接下來以S非空為判斷標准,比較一次,彈出一次,一旦有不相等,則說明待測試棧不是給定棧的棧混洗,返回false,還有一種十分特殊的情況,如果B的棧底元素(也就是temp的棧頂元素)在A中根本就沒有,即使A全部彈出,也不會觸發循環里面的return false,所以,最后要用S是否為空作為判斷依據返回

這里還有個小插曲,main函數里面第一次cin結束按<C-d>后將cin流的eofbit置位了,所以后面那個cin怎么也輸入不了,程序總是報段錯誤(猜測與cin.eof()的條件判斷吻合),需要將cin流狀態復位才能繼續輸入


免責聲明!

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



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