这里使用的是O(n)的算法:
思路:再来一次栈混洗,看能不能实现序列B中的效果。(设A为输入栈,B为要验证的栈)
- 先将要验证的栈B转移到栈rb,这样B的栈底就位于rb的栈顶了,让我们可以知道依次放入栈B的元素是哪些。
- 模拟混洗的过程,如果rb栈顶与s中一样,那么就将rb和s都pop。
- 如果s为空,则表示能实现栈B这样一个结果。
#pragma once
#include <stack>
using namespace std;
template<class T>
bool stackWashing(stack<T> a, stack<T> b) {
stack<T> 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();
}