算法学习----给定入栈的顺序,判断另一个顺序是否为该入栈顺序的一个弹出顺序

本文介绍了一种算法,用于判断一个序列是否能通过特定的栈操作得到。通过对比输入的两个序列,利用辅助栈来模拟压栈和弹栈的过程,以此验证序列的有效性。

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

分析:要判断另一个序列是否为当前入栈顺序的一个输出顺序,就必须将输出顺序作为结果,进行比对:思考过程如下:
1.先从popA[0]开始比较,如果popA[0]先弹出,则意味着它之前的元素的没有弹出,那么需要将它之前的元素的压入栈中,压栈的判断条当前的栈顶元素!=popA[0],最后的结果是如果栈顶元素等于当前的popA[0],然后弹出该元素,进入下一个循环popA[1]的比较。
2. 当元素全部入栈(已经弹出的不算),就需要判断栈内元素的弹出顺序是否与后续popA[i]的值相等,是返回true,否则返回false

import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        if(popA.length==0||pushA.length==0)return false;
        Stack<Integer> stack = new Stack<Integer>();//建立一个临时栈
        boolean flag = true;
        stack.push(pushA[0]);//先入栈pushA中的一个元素
        for(int j=1,i=0;i<popA.length;){//循环条件i小于popA[]的长度
           if(stack.peek()!=popA[i]){//栈顶元素与popA中的当前元素值不相等
               if(j<pushA.length)// 判断pushA下标是否越界,最后的j值会比数组长度大1,之所以这样做,是因为最后只有栈内有未弹出的元素的时,j的下标一定是越界了
                    stack.push(pushA[j++]);
               else{//对j值的越界处理
                   if(!stack.empty()){//如果栈不为空
                        int t = stack.pop();//从栈中弹出一个值
                        if(t!=popA[i])return false;//比较这个值与当前popA[i]是否相等,如果不相等,返回false。
                   }
                   else return true;//如果栈空了,没有和执行上面的return false语句,说明符合要求,返回true
               }
           }
           else{//如果栈顶元素等于当前popA[i]值,将这个值弹出
               stack.pop();
               i++;//i指向下一个popA[i]的值
           }
       }
       return flag;//程序执行不到这一步

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值