栈混洗


栈混洗的概念

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