hdu 1022 简单的栈应用
来源:互联网 发布:淘宝新店卖啥好 编辑:程序博客网 时间:2024/06/05 17:48
本题链接:点击打开链接
Train Problem I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 35730 Accepted Submission(s): 13471
3 123 3213 123 312
Yes.inininoutoutoutFINISHNo.FINISHFor the first Sample Input, we let train 1 get in, then train 2 and train 3.So now train 3 is at the top of the railway, so train 3 can leave first, then train 2 and train 1.In the second Sample input, we should let train 3 leave first, so we have to let train 1 get in, then train 2 and train 3.Now we can let train 3 leave.But after that we can't let train 1 leave before train 2, because train 2 is at the top of the railway at the moment.So we output "No.".HintHint
题意:火车的进出站问题,先给出N个火车,再按序列一的方式进站,判断能否以序列二的方式出站,若能先输出“Yes.”,再输出出站步骤,以FINISH结束,若不能,输出“No.”,仍以FINISH结束。
PS:对栈的理解不深有错误请大佬指正,然后在网上查找了一些栈的知识。
1. 定义
栈(Stack),是硬件。主要作用表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为先进后出表。
2. 栈的方法
empty() 测试堆栈是否为空。返回boolean。
peek() 查看堆栈顶部的对象,但不从堆栈中移除它。返回泛型E。
pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象。返回泛型E。
push(E item) 把项压入堆栈顶部。返回泛型E。
search(Object o) 返回对象在堆栈中的位置,以 1 为基数。返回int。
3. 栈的实现
1、进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否
已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2、退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈,
空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
以上相关知识来自(http://www.360doc.com/content/12/1009/16/9400799_240455229.shtml)(里面还有链表和队列的知识,大家也可以看看)。
解题思路:首先我们得知道进站不一定是一次性进入,也就是说中途可以出站,不然简直太容易了。然后就是简单的栈模拟了。直接上代码。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <stack>using namespace std;int main(){ char s1[100],s2[100]; //进站序列为s1,目标出站序列为s2. int n,j,k,f[100]; //f数组用来记录进出站(栈) stack<char>s; //栈的建立 while(~scanf("%d%s%s",&n,s1,s2)) { while(!s.empty()) //测试数据有多组,若栈不为空就先清空栈,防止意外发生 s.pop(); memset(f,-1,sizeof(f)); j=k=0; for(int i=0; i<n; i++) { s.push(s1[i]); //将s1[i]元素压入队列,即为进栈 f[k++]=1; //f[x]=1 表示进栈 while(!s.empty()&&s.top()==s2[j]) //若栈顶元素(火车)与待出站火车相同则出站 { f[k++]=0; //f[x]=0表示出栈 s.pop(); //删除出栈元素 j++; //下一个出站火车就绪 } } if(j==n) //若出站火车等于待出站的火车,出站成功 { printf("Yes.\n"); for(int i=0; i<k; i++) //输出火车进出站步骤 { if(f[i]) printf("in\n"); else printf("out\n"); } } else //否则表示出站失败 printf("No.\n"); printf("FINISH\n"); } return 0;}
- hdu 1022 简单的栈应用
- hdu 1022 简单栈应用
- hdu 1022 Train Problem I (栈的简单应用)
- HDU 1022 Train Problem I(栈的简单应用)
- hdu-1022 Train Problem I (栈的简单应用)
- Hdu 1022 Train Problem I (栈的简单应用)
- hdu 1237简单计算器(栈的简单应用)
- HDU 1870 愚人节的礼物(栈的简单应用)
- HDU 1870 愚人节的礼物(栈的简单应用)
- hdu-1022 栈的应用。
- hdu 1022 栈的应用
- hdu Train Problem I(栈的简单应用)
- hdu 1702 栈和队列的简单应用
- HDU 1237(简单计算器)栈的应用-表达式求值
- HDU 1237 简单计算器(栈的应用)
- HDU.1022 Train Problem I【栈的简单应用】(3.14)
- hdu 1251 字典树的简单应用
- hdu(素数的简单应用)
- poj2488
- 【工程经验】Linux命令行下常用svn命令总结
- 给初学者的RxJava2.0教程(八)
- Java ConcurrentModificationException异常原因和解决方法
- 翻转链表
- hdu 1022 简单的栈应用
- Tomcat 安装以及部署网站实例
- ARM SMMUv3 architecture in linux
- 单例模式
- [BZOJ3189][Coci2011][扫描线][线段树]Slika
- 引用
- YOLO V2教程之训练自己的数据
- Jquery怎么获取select选中项 自定义属性的值
- SpringMVC3的ResponseBody返回字符串乱码问题解决