堆栈的模拟,给定序列,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;
}

poj1363的更多相关文章

  1. [poj1363]Rails_模拟_栈

    Rails poj-1363 题目大意:判断一个序列是否是1~n的合法出栈序列. 注释:$1\le n\le 10^4$. 想法:开始想到一种想法. 对于一段序列来讲,显然从首元素开始的连续小于尾元素 ...

  2. POJ1363:Rails

    Description There is a famous railway station in PopPush City. Country there is incredibly hilly. Th ...

  3. 火车进出站(POJ1363)

    题目链接:http://poj.org/problem?id=1363 #include <stdio.h> #include <stack> using namespace ...

  4. POJ1363 Rails 验证出栈序列问题

    题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路: 1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适 ...

  5. poj1363——Rails

    Description There is a famous railway station in PopPush City. Country there is incredibly hilly. Th ...

  6. poj1363 Rails Central Europe 1997

    P.S.: 输出换行 三个方法 1.直接按照要求做 根据给的数,需要push,pop哪些数据,具有唯一性 数最多进栈一次,出栈一次 O(n) Source Code Problem: User: co ...

  7. OJ题目分类

    POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...

  8. 【栈】 poj 1363

    poj1363,这道题是数据结构与算法中的经典问题,给定一组进栈顺序,问栈有多少种出去的顺序. #include<stdio.h> #include <stack> #incl ...

随机推荐

  1. sqlite3 C API编程

    1,创建测试数据库,表;

  2. phpcms:一、安装及新建模板

    1.复制D:\WWW\phpcms\phpcms\templates\目录下的default文件粘贴在当前目录下,并重命名为新模板名字(youpinzhiyuan2012) 2.打开D:\WWW\ph ...

  3. JS字符串拼接优化

    // 请把以下用于连接字符串的JavaScript代码修改为更高效的方式 var htmlString = ‘ < div class=”container” > ’ + ‘ < u ...

  4. java java.uitl.Random产生随机数

    通过使用java.uitl.Random产生一个1-10内的随机数.例: Random random = new Random(); int i = Math.abs(random.nextInt() ...

  5. python高级编程之我不测试

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#测试驱动开发(高级编程处学习,第11章)#测试驱动开发也叫TDD, 是制造高质量软件的一种简单技 ...

  6. android分享到新浪微博,认证+发送微博,

    分享到新浪微博,折腾了大半个月,现在终于弄出来了,心里的那个爽呀,太痛快了,哈哈!! 废话少说,首先是认证, 1.进入新浪微博提供的开放平台http://open.weibo.com/ 注册新浪账号. ...

  7. 操作系统——IO缓存技术

    一.为什么引入缓存技术 为了解决cpu速度和外部设备速度不匹配的问题. 降低了io对cpu的中断的次数.每进行一次IO设备的时间都非常长,所以把数据先放入缓冲区,再进行IO操作. 二.缓冲技术的实现 ...

  8. C-二维数组,多维数组

    -----二维数组      ->在数组定义当中,行数和列数需要用常量定义      ->在定义的时候如果没有数值进行填充,则补零      ->第一个数是行,第二个数是列     ...

  9. Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据

    使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载.这同样要实现OnScrollL ...

  10. Javascript进阶篇——(DOM—认识DOM、ByName、ByTagName)—笔记整理

    认识DOM文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 将HTML代码分解 ...