21 栈的压入,弹出序列 判断入栈和出栈顺序IsPopOrder<输入同长度的两个一维数组>...

题目:栈的压入,弹出序列

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

模拟入栈和出栈的过程,查看是否一致。详细思路如下:

举例:入栈序列为1,2,3,4,5 某一序列为 2,3,1,4,5 。首先选择1 入栈,然后查看序列2 是否相同,不同说明没有出栈,继续入栈2,继续查看 相同,说明2出栈,然后继续查看是否相同1和3不同,继续入栈3,查看和序列2中的头元素3一致,出栈,继续查看序列1中的1,和序列2中的1 一致,然后出栈。。。直到最终序列2为空;如果最后发现序列1为空的时候序列2中仍然有元素,则说明不是合法出栈序列;

 

【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

举例:

入栈1,2,3,4,5

出栈4,5,3,2,1

首先1入辅助栈,此时栈顶1≠4,继续入栈2

此时栈顶2≠4,继续入栈3

此时栈顶3≠4,继续入栈4

此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3

此时栈顶3≠5,继续入栈5

此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3

….

依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。
 
 1 import java.util.*;
 2 import java.util.Stack;
 3 public class Solution {
 4     public static boolean IsPopOrder(int [] pushA,int [] popA) {
 5         //先考虑特殊情况
 6         if(pushA.length != popA.length) return false;
 7         if(pushA.length==0 ||  popA.length==0) return false;
 8         //模拟堆栈的过程,新建辅助堆栈
 9         Stack<Integer> temp = new Stack<Integer>();
10         //只用设置pushA的长度即可,对于popA设置一个指针popindex表明到哪个位置
11         int length = pushA.length;
12         int popindex =0;
13         for(int i=0;i<length;i++){
14             temp.push(pushA[i]);
15             //注意这里是while,也就是如果一直相同,那么辅助栈一直出站,指针popindex一直后移
16             while((!temp.empty())  &&  ((int)temp.peek() == popA[popindex])){
17                 temp.pop();
18                 popindex++;
19             }
20         }
21         //最终判断辅助栈是否为空即可
22         return temp.empty();
23     }
24     public static void main(String [] args){
25         Scanner sc = new Scanner(System.in);
26         System.out.println("请输入两个整数序列的长度(默认两个序列长度相同)");
27         int length = sc.nextInt();
28         System.out.println("请输入 入栈整数序列");
29         int[] pushA = new int[length];
30         for(int i=0;i<length;i++){
31             pushA[i]=sc.nextInt();
32         }
33         System.out.println("请输入 出栈个整数序列");
34         int[] pushB = new int[length];
35         for(int j=0;j<length;j++){
36             pushB[j]=sc.nextInt();
37         }
38         sc.close();
39         boolean result= IsPopOrder(pushA,pushB);
40         System.out.println("出栈序列是否是入栈序列的一个出栈顺利"+result);
41         
42     }
43 }

 

 

本地编译代码:

 1 import java.util.*;
 2 import java.util.Stack;
 3 public class Solution516Day1 {
 4     public static boolean IsPopOrder(int [] pushA,int [] popA) {
 5         //先考虑特殊情况
 6         if(pushA.length != popA.length) return false;
 7         if(pushA.length==0 ||  popA.length==0) return false;
 8         //模拟堆栈的过程
 9         Stack<Integer> temp = new Stack<Integer>();
10         int length = pushA.length;
11         int popindex =0;
12         for(int i=0;i<length;i++){
13             temp.push(pushA[i]);
14             while((!temp.empty())  &&  ((int)temp.peek() == popA[popindex])){
15                 temp.pop();
16                 popindex++;
17             }
18         }
19         //最终判断堆栈是否为空即可
20         return temp.empty();
21     }
22     public static void main(String [] args){
23         Scanner sc = new Scanner(System.in);
24         System.out.println("请输入两个整数序列的长度(默认两个序列长度相同)");
25         int length = sc.nextInt();
26         System.out.println("请输入 入栈整数序列");
27         int[] pushA = new int[length];
28         for(int i=0;i<length;i++){
29             pushA[i]=sc.nextInt();
30         }
31         System.out.println("请输入 出栈个整数序列");
32         int[] pushB = new int[length];
33         for(int j=0;j<length;j++){
34             pushB[j]=sc.nextInt();
35         }
36         sc.close();
37         boolean result= IsPopOrder(pushA,pushB);
38         System.out.println("出栈序列是否是入栈序列的一个出栈顺利"+result);
39         
40     }
41 }
View Code

思考1:给出入栈顺序,请给出所有的出栈可能(TODOLIST) 代码该如何写

思考2:对于选择题或者判断题,去迅速判断

 

转载于:https://www.cnblogs.com/shareidea94/p/10877601.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值