栈:栈的结构是很简单的,简单来说就是一个先入后出的列表。
栈混洗:一个放在栈序列入中间栈再出中间栈得到一个新的栈。
那么如何判断一个序列是否是出栈序列呢?
1.简单判断:
首先,我们拿一种简单情况来看
初始栈:(1,2,3] 很明显新的栈不可能是[3,1,2)
圆括号代表栈顶
从这里我们就能看出, 对于(…i,…j…..,k..],只要序列为[….k,…i,…j)那么这个序列一定不是出栈序列。
通常的面试题都会这样说:按 1,2,3,4,5的顺序入栈,那么正好对应了(…i,…j…..,k..],出栈序列不可能为4,5,3,1,2 对应了 [….k,…i,…j),这样你在判断的时候就可以一目了然
2.通过程序来判断
package dataQingHua;
import java.util.Scanner;
import java.util.Stack;
public class IsStackArrangement {
public static void main(String[] args) {
isStack1();
}
public static void isStack1(){
Stack<Integer> a=new Stack<Integer>();
Stack<Integer> o=new Stack<Integer>();
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int t=0;
int[] arr=new int[n];
for(int i=0;i<n;i++){
t=sc.nextInt();
arr[i]=t;
}
int m=sc.nextInt();
while (m-->0)
{
for(int i=arr.length-1;i>=0;i--){
a.push(arr[i]);
}
int c;
boolean flag = false;
for (int i = 0; i<n; i++)
{
t=sc.nextInt();
if (flag)
continue;
if (o.empty())
{
o.push(a.peek());
a.pop();
}
while (!o.empty())
{
c = o.peek();
if (c == t)
{
o.pop();
break;
}
else
{
if (a.empty())
{
flag = true;
break;
}
o.push(a.peek());
a.pop();
}
}
}
if(!o.empty()){
o.pop();
}
if(!a.empty()){
a.pop();
}
if (flag)
System.out.println("no");
else
System.out.println("yes");
}
}
}
基本步骤已经在代码中解释了。
值得注意的是,这里要判断多个序列是否是出栈序列,那么每一次都要初始化原序列。我一开始直接用两个栈A,B来作为变量,每次判断一个序列的时候,都用A=B,B存放的是初始化好的原序列。结果出现问题了,大意之下,忘了java变量保存的是引用,改变a的同时,b也跟着改变了。
for(int i=arr.length-1;i>=0;i--){
a.push(arr[i]);
}
还是通过一次次赋值来重新初始化序列。还没想到更好的办法。