剑指offer(12)-栈的压入弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为栈的弹出顺序,假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压入序列,4、3、5、1、2就不可能是该压栈序列的弹出序列。

书中用双栈的方法来解决,这个方法比较麻烦也不容易理解,用一个栈就好了,只要将栈序列一个一个压入,
检测栈中是否为空,若空,说明出栈队列可由原数列进行栈操作得到。否则,说明出栈队列不能由原数列进行栈操作得到,这样代码比较好写,也很简洁。

class Solution {
public:

    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
    if(pushV.empty() || popV.empty())
            return false;
        if(pushV.size() != popV.size())
            return false;
        stack<int> s;
        int j = 0;
        for(int i = 0;i < pushV.size();++i)
            {
            s.push(pushV[i]);
            while((!s.empty()) && s.top() == popV[j])
                {
                s.pop();
                ++j;
            }
        }
        if(s.empty())
            return true;
        else
            return false;
}
};

这里发现牛客网的一个小BUG,如果(!s.empty()) && s.top() == popV[j]写成s.top() == popV[j] && (!s.empty()) 的话就说是发生了段错误。。。。。。然而并没有什么错误。

你可能感兴趣的:(数据结构与算法-刷题)