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;
}

posted @ 2015-05-01 12:54  Gabyler  阅读(412)  评论(0编辑  收藏  举报