剑指offer-题22:栈的压入、弹出序列

根据输入的栈压入顺序和一个序列,判断该序列是否可能是栈的合法弹出顺序。例如,输入序列1,2,3,4,5,如果弹出序列是4,5,3,2,1,则合法;而4,3,5,1,2则不合法。解决方案涉及栈操作的模拟过程。" 114334163,10535824,MySQL彩票统计:查找匹配三个球的组合,"['数据库', 'SQL查询', '数据处理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

实验平台:牛客网


解决思路:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

java:

import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        boolean possible = false;
        if (pushA.length > 0 && popA.length > 0) {
            int pushIndex = 0;
            int popIndex = 0;
            Stack<Integer> dataStack = new Stack<Integer>();
            while (popIndex < popA.length) {
                while (dataStack.isEmpty() || dataStack.peek() != popA[popIndex]) {
                    // 将压栈序列压入一个栈中直到: 1.栈顶元素和弹出序列的索引位置相同
                    // 2.压栈序列遍历结束也没有找到和弹出序列的索引位置相同的值
                    if (pushIndex == pushA.length) {
                        break;
                    }
                    dataStack.push(new Integer(pushA[pushIndex]));
                    pushIndex++;
                }
                if (dataStack.peek() != popA[popIndex]) {
                    break;
                }
                dataStack.pop();
                popIndex++;
            }
            if(dataStack.isEmpty() && popIndex == popA.length){
                possible = true;
            }
        }
        return possible;
    }
}

python:

# -*- coding:utf-8 -*-
class Solution:
    def IsPopOrder(self, pushV, popV):
        # write code here
        possible = False
        if len(pushV) > 0 and len(popV) > 0:
            push_index = 0
            pop_index = 0
            stack = []
            while pop_index < len(popV):
                while len(stack) == 0 or stack[-1] != popV[pop_index]:
                    if push_index == len(pushV):
                        break
                    stack.append(pushV[push_index])
                    push_index += 1
                if stack[-1] != popV[pop_index]:
                    break
                stack.pop()
                pop_index += 1
            if pop_index == len(popV) and len(stack) == 0:
                possible = True
        return possible
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值