剑指offer—栈的压入、弹出序列

来源:互联网 发布:java系统架构师 编辑:程序博客网 时间:2024/05/16 11:22

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/3

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

解析:这个题目笔算的时候是没有一点问题的,属于简单题目。编程写的时候用两个指针,分别指示入栈序列和出栈序列已经指向的元素,用一个栈记录入栈未出栈元素。主要注意出栈向量指针的三种情况:
1、入栈向量指针和出栈向量指针指向的元素相同的话,两个指针向后走(不用入栈s)
2、栈顶元素和出栈向量指针指向元素相同的话,栈顶元素出栈
3、如果出栈向量指针指向的元素和入栈向量指针指向的元素和栈顶元素均不相同的时候,若入栈向量指针不到末尾,则入栈,否则返回false.
如果模拟完成,则返回true.

class Solution{public:    bool IsPopOrder(vector<int> pushV, vector<int> popV)    {        if(pushV.size()==NULL)            return false;        stack<int> s;        int pNext = 0, n = pushV.size(), pOut = 0;        while (pOut < n)        {            if ((pNext<n) && (pushV[pNext] == popV[pOut]))            {                pNext++;                pOut++;            }            else            {                if ((s.empty()==false)&&(s.top() == popV[pOut]))                {                    s.pop();                    pOut++;                }                else                {                    if (pNext < n)                    {                        s.push(pushV[pNext]);                        pNext++;                    }                    else                        return false;                }            }        }        return true;    }};
0 0