题目:栈的压入,弹出序列
要求:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 }
本地编译代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
思考1:给出入栈顺序,请给出所有的出栈可能(TODOLIST) 代码该如何写
思考2:对于选择题或者判断题,去迅速判断