栈混洗

栈混洗_第1张图片
这里使用的是O(n)的算法:
思路:再来一次栈混洗,看能不能实现序列B中的效果。(设A为输入栈,B为要验证的栈)

  1. 先将要验证的栈B转移到栈rb,这样B的栈底就位于rb的栈顶了,让我们可以知道依次放入栈B的元素是哪些。
  2. 模拟混洗的过程,如果rb栈顶与s中一样,那么就将rb和s都pop。
  3. 如果s为空,则表示能实现栈B这样一个结果。
#pragma once
#include 
using namespace std;

template
bool stackWashing(stack a, stack b) {	
	stack rb, s;
	while (b.size()) {
		rb.push(b.top());
		b.pop();
	}
	while (a.size()) {
		s.push(a.top());
		a.pop();
		if (s.top() == rb.top()) {
			s.pop();
			rb.pop();
			while (s.size() && s.top() == rb.top()) {
				s.pop();
				rb.pop();
			}
		}
	}
	return s.empty();
}

你可能感兴趣的:(算法)