-
题目:
给定两个序列,一个入栈序列pushed,一个出栈序列poped,且poped是pushed的排列,判断他们是否合法?
序列中的元素值不相等; -
思路:
1.一对pushed和poped序列,只会对应一种实际出入栈操作:例如pushed = [ 1,2,3,4,5 ],poped = [ 4,5,3,2,1 ];先依次入栈1,2,3,4,此时必须pop4,如果此时不弹出,继续入栈的话,4的上面就会盖上其它数,由于先进后出的特点,无论如何poped序列的第一个也不可能是4了,因此每个数该被弹出的时候必须立刻弹出,不能拖延;因此,如果一对pushed和poped有效的话(即return true),那么它们只会对应一种实际操作;
2.我们要做的是去模拟出这种操作;
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int m = pushed.size(), n = popped.size();
if (!m && !n) return true;//都为空
else if (!m || !n || m != n) return false;//只有一个为空,或 都不为空但长度不同
stack<int> stk;
int j = 0;//用于表示接下来该弹出poped序列中的哪一个了
for (int i = 0; i < m; ++i) {
//每入栈一个数,都弹到不能弹出为止,即确保该弹的时候一定都能弹出来
stk.push(pushed[i]);
while (!stk.empty() && stk.top() == popped[j]) {
//时刻尝试弹出poped[i],一旦能弹出,立刻弹出
stk.pop();
++j;
}
}
return stk.empty(); //若栈为空,说明push了所有数,且全部pop出来了
}
};