问题描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
解题思路:
拿到这个题我开始想的是能不能找规律,看有没有规律可寻找,但是没有找到。
然后我又想到了另一种方法,模拟出栈顺序,如果能模拟出来,那么就能够判断是否为正确的出栈顺序。
- 创建一个stack st;
- 每次取pushed的元素入栈st
- 入栈元素如果与poped第一个元素相同,则poped下标向后移动,st.pop();直到元素不相等,则退出本次循环,重复2。
- 直到pushed走到末尾。
代码如下:
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int j=0;//用来标识poped的下标
for(int i=0;i<pushed.size();i++)
{
/*其实这里可以优化,不需要判断语句,因为每次for循环上来都要入数据。*/
if(_push.empty()|| _push.top()!=popped[j])
{
_push.push(pushed[i]);
}
/*这里就是连续判断*/
while(!_push.empty() &&_push.top()==popped[j])
{
_push.pop();
++j;
}
}
//如果最后_push为空,则说明可以模拟,则此出栈顺序正确。
if(_push.empty())
{
return true;
}
else
{
return false;
}
}
private:
stack<int> _push;
};