zoukankan      html  css  js  c++  java
  • 21栈的压入、弹出序列

    题目描述

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
     
     
    思路:
     
    建立辅助栈
    例如12345 是压栈顺序,45321是出栈顺序。 第一个被弹出的数字是4,所以根据压栈顺序12345,把1234压入辅助栈
    此时把辅助栈里的4弹出,辅助栈的栈顶是3 不等于5,继续把压栈顺序里的5压入辅助栈,此时辅助栈顶元素是5,与出栈顺序的第二个元素相等,弹出辅助栈的5,此时栈顶是3,与出栈顺序的3相等,辅助栈弹出3,依次类推,最后辅助栈为空,说明45321是出栈顺序。

    例如12345 是压栈顺序,43512是出栈顺序。 第一个被弹出的数字是4,所以根据压栈顺序12345,把1234压入辅助栈
    此时把辅助栈里的4弹出,辅助栈的栈顶是3 等于出栈顺序的第二个元素,把辅助栈的3弹出,此时栈顶是2,2不等于5,把压栈顺序里的5压入辅助栈,此时辅助栈顶是5,与出栈顺序第三个相等弹出5.此时辅助栈顶是2,2不等于出栈顺序第4个元素1,继续压栈,但是压栈顺序为空了,辅助栈也没变空,说明43512不是出栈顺序。


    总结:
    如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,如果下一个弹出的数字不在栈顶,直到把下一个需要弹出的数字压入栈为止。如果所有的数字懂压入栈了,还没找到下一个弹出的数字,那么这个序列不是出栈顺序。
     
    错误代码把 while 写成 if 了!!!!
     1 import java.util.ArrayList;
     2 import java.util.Stack;
     3 public class Solution {
     4     public boolean IsPopOrder(int [] pushA,int [] popA) {
     5       Stack<Integer> s = new Stack<Integer>();
     6         int pushindex = 0;
     7         int popindex = 0;
     8       for(;pushindex<pushA.length;pushindex++){
     9        s.push(pushA[pushindex]);
    10        while(!s.empty()&& popA[popindex] == s.peek()){
    11            s.pop();
    12            popindex++;
    13        }
    14       }
    15       return s.empty();
    16     }
    17 }
  • 相关阅读:
    关于postgresql——常用操作指令
    linux 下查看机器是cpu是几核的
    ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”
    .NET平台开源项目速览(4).NET文档生成工具ADB及使用
    Hadoop学习---安装部署
    c# 模拟表单提交,post form 上传文件、大数据内容
    半小时学会上传本地项目到github
    统计网卡TX(发送)RX(接受)流量脚本
    mysql mysqldump只导出表结构或只导出数据的实现方法
    psutil--跨平台的进程管理
  • 原文地址:https://www.cnblogs.com/zle1992/p/7835081.html
Copyright © 2011-2022 走看看