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

来源:互联网 发布:教务办公平台软件 编辑:程序博客网 时间:2024/04/28 05:15

分析:要判断另一个序列是否为当前入栈顺序的一个输出顺序,就必须将输出顺序作为结果,进行比对:思考过程如下:
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;//程序执行不到这一步    }}
阅读全文
0 0
原创粉丝点击