栈的入栈,出栈序列问题

问题(1)

(1)一个栈的入栈序列是A,B,C,D,E,则出栈序列不可能是?()
A、 EDCBA
B、 DECBA
C、DCEAB
D、ABCDE

答案:C

(2)若进栈序列为1,2,3,4假定进栈和出栈可以穿插进行,则可能的出栈序列是()
A、 2,4,1,3
B、 3,4,1,2
C、1,2,3,4
D、3,1,4,2

答案:C

题目隐含的意思,进栈与出栈的顺序,时机任意,且不限次数

上面两题看起来像是不一样的题目,其实是一样的意思;
1,2,3,4可以和A,B,C,D等同
先给它们每个元素(不管是数字还是字符串)标个序号,后面直接对序号操作就OK了【按照1,2,3,…,n的顺序】

解题思路:
已知栈的输入序列是1,2,3,…,n,输出序列是a1,a2,…ai,…,an。
然后我们任选一个数ai,并筛选ai到an之间所有<=ai的元素,则它们一定是按照从大到小的顺序排列的。

(“从大到小“不一定紧紧相邻,只代表相对位置关系,比如(…,10,…,7,…,3,…,1,…)
举例:
入栈顺序:1 2 3 4 【n=4】
出栈顺序:3 2 1 4
验证:
让i=1,那么ai=3,后面小于3的有2,1。刚好3,2,1是按照从大到小的顺序排列的
让i=2,那么ai=2,后面小于2的有1。刚好2,1是按照从大到小的顺序排列的
让i=3,那么ai=1,后面小于1的有NULL,满足。
让i=4,没用小于4的满足,NULL

** [不充分条件]**


问题(2)

栈的压入,弹出序列

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

(摘自剑指offer)

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty()) return false;
        vector<int> stack;
        for(int i=0,j=0;i<pushV.size();)   // i=j=0 不行
        {
            stack.push_back(pushV[i++]);
            while(j<popV.size() && stack.back()==popV[j])
            {
                stack.pop_back();
                j++;
            }
        }
        return stack.empty();
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值