poj1363
堆栈的模拟,给定序列,1,2,3,4,...判断堆栈出栈顺序是否合法
5 //5个数入栈
1 2 3 4 5 //出栈顺序
5 4 1 2 3 //出栈顺序
0 //5个数的结束
6 //6个数的入栈
6 5 4 3 2 1
0 //6个数的结束
0 //输入结束
数组作栈
a栈放目标出栈顺序,让1,2,3,4依次入stack栈,如果a[pos]和stack[top]比较,相同,pos++,top--即表示出栈,top开始为-1,表示为空栈
如果一开始a[0]=3,stack[0]=1,这个时候继续让2,3入stack栈,期间1,2均不能出栈,因为a[0]=3,即是3为第一个出栈的
比较了stack[top]stack栈的栈顶元素,如果相同,应当让stack栈顶元素出栈即是top--,让--之前的stack[top]失效,取当前栈顶元素比较,如果不同才,才让新元素入栈
一定是先比较当前栈里面,没有才让新元素入栈,注意技巧:cur=0,先单独赋值stack[++top]=++cur,注意容易写成stack[top++]=++cur,大错特错
栈的比较过程:如果当前栈顶元素与a栈待取元素相同
if(a[pos]==stack[top])
a栈向下移一位,表示当前待取,top为很可能为-1,当前栈空,top=0,stack[top]=++cur,++cur的作用:跟踪新数
else
stack[++top]=++cur
如果当前stack栈顶元素与a栈中待取数不同,不能够top--,因为就算相同,你也不能让他出栈,因为它出栈先进后出
总结:如果当前栈顶元素,与a栈中待取数不同,新元素入栈,如果相同,更新栈顶元素(可能为空栈)
while(pos<tim && top<tim)解释:
合法出栈:最后一次为a[tim-1],pos++,pos=tim,出循环
非法出栈:top==tim时候
判断用top==tim或者pos==tim
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,tim;
int a[1024],stack[1024];
while(scanf("%d",&tim)!=EOF)
{
if(tim==0)
return 0;
while(1){
for(i=0;i<tim;i++)
{
scanf("%d",&a[i]);
if(a[0]==0)
break;
}
if(a[0]==0)
break;
int pos=0,cur=0,top=-1;
stack[++top]=++cur;
while(pos<tim && top<tim)
{
if(a[pos]==stack[top])
{
top--;
pos++;
if(top<0)
{
top=0;
stack[top]=++cur;
}
}
else
stack[++top]=++cur;
}
if(top==0)
{
printf("Yes\n");
}
else
printf("No\n");
}//line of block
printf("\n");
}//block
return 0;
}