后进先出 栈 简单应用

Description

在PushPop城中有一个著名的火车站,车站铁路如图所示。

每辆火车都从A方向驶入车站,再从B方向驶出车站,同时它的车厢可以进行某种形式的重新组合。假设从A方向驶来的火车有N节车厢(N≤1000),分别按顺序编号为1,2,…,N。负责车厢调度的工作人员需要知道能否使它以A1,A2,…,An的顺序从B方向驶出。
请你编写程序,用来判断能否得到指定的车厢顺序。假定在进入车站之前每节车厢之间都是不连着的,并且它们可以自行移动,直到处在B方向的铁轨上。另外假定车站可以停放任意多的车厢。但是一旦车厢进入车站,它就不能再回到A方向的铁轨上了,并且一旦它驶入B方向的铁轨后,它就不能再回到车站。

Input

第1行输入N,接下来的一行是任意多个的出站重组顺序(A1,A2,…,),以0为结束标志,用空格分隔。

Output

输出Yes表示可以把火车(1,2,…,N)火车编排成所需要的顺序(A1,A2,…,),否则用No表示。

Sample Input

5
1 2 3 4 5 0

Sample Output

Yes

正好是栈的简单应用,a,b代替两个站进出火车的编号,target[]保存出站顺序

 1 //栈的特点是先进后出
 2 /*1-n进站,能否按给定顺序出站
 3 */
 4 #include<cstdio>
 5 #include<iostream>
 6 #include<stack>
 7 using namespace std;
 8 const int MAX=1000+10;
 9 int n;
10 int target[MAX];
11 int main()
12 {
13     while(scanf("%d",&n)==1)
14     {
15         stack<int>s;
16         int a=1;
17         int b=1;
18         for(int i=1;i<=n;i++) cin>>target[i];
19         int ok=1;
20         while(b<=n)
21         {
22             if(a==target[b]){a++;b++;}
23             else if(!s.empty()&&s.top()==target[b]){s.pop();b++;}
24             else if(a<=n) s.push(a++);
25             else{ok=0;break;}
26         }
27         printf("%s\n",ok?"Yes":"No");
28     }
29     return 0;
30 }
时间: 2024-10-18 17:37:45

后进先出 栈 简单应用的相关文章

STL的队列和栈简单使用

STL的队列和栈简单使用 #include <iostream>#include <cstdio>#include <string.h>#include <algorithm>#include <queue>#include <stack>using namespace std;int main(){ queue<int> Q; stack<int> S; int i; for(i=1;i<=10;i++

[转载]C++ 堆与栈简单的介绍

在C和C++中,有三种使用存储区的基本方式: [静态存储区(Static   Memory)] 在静态存储区中,连接器(linker)根据程序的需求为对象分配空间.全局变量.静态类成员以及函数中的静态变量都被分配在该区域中.一个在该区域中分配的对象只被构造一次,其生存期一直维持到程序结束.在程序运行的时候其中的地址是固定不变的.在使用线程(thread,共享地址空间的并发物)的程序里,静态对象可能会引起一些问题,因为这时的静态对象是被共享的,要对其正常访问就需要进行锁定操作. [自动存储区(Au

每日一题之LeetCode 栈简单题集合496,682,232,225,155,844,20

496 下一个最大的元素方法1 :自己瞎写的 没有考虑到栈的特性class Solution:def nextGreaterElement(self, nums1, nums2): L=[] for i in nums1: k=nums2.index(i) lenth2=len(nums2) if k==lenth2-1: L.append(-1) for j in range(k+1,lenth2): if nums2[j]>i: L.append(nums2[j]) break if j==

不使用栈简单实现括号匹配算法

刚刚做数据结构作业时有这样一道书本习题,题目如下: 3.2 假设以I和O分别表示进栈和出栈操作,栈的初态和终栈均为空,进栈和出栈的操作序列可表示为仅由I和O组成的序列. (1)下面所示的序列中哪些是合法的? A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIOOIOO (2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法.若合法则返回1:否则返回0.(假设被判定的操作序列已存入一位数组中). 第一题思考了一下,AD 第二题本来想用栈来做,但似乎又没有

链栈简单操作

/*设置一个静态变量记链表值的个数入栈是头插法 */#include<stdio.h>#include<stdlib.h>#include<malloc.h>static int count=0;typedef struct node{ int data; struct node *next;}stacknode,*linkstack;/*typedef struct stack{ struct stack pop; struct stack bottom;}stack

栈简单运用

读入n个整数 定义栈数据类型 定义栈的初始化.判空.判满.入栈.出栈函数 写一主函数,完成n个数的读入和逆序输出 #include<stdio.h> #define stacksize 100 #define OK 1 #define ERROR 0 #define Overflow -1 typedef int Status; typedef int ElemType; typedef struct { ElemType data[stacksize]; int top; }SeqStack

数据结构之栈定义及基本操作实现

终于有可以有时间写点数据结构的学习总结了,前段时间一直在紧张的忙一些项目,都没有空出时间来学习数据结构,现在终于可以稍微喘口气了,还是数据结构有意思,这两天看了点栈的东西,写下来总结一下,有错误的地方希望看到的朋友指出来,感激不尽. 根据学习,栈就是一种线性数据结构,栈的运算只能在表的一段进行,所以这种数据结构具有“后进先出”的特点. 接下来是栈的c语言实现.其中栈由一个top节点和bottom节点组成,这两个节点分别指向栈的顶部和底部.其中栈的组成结点是由结构体实现,结构体由数据库和指向下一个

3.基本数据结构-栈

一.线性数据结构 - 我们从四个简单但重要的概念开始研究数据结构.栈,队列,deques(双向队列), 列表是一类数据的容器,它们数据元素之间的顺序由添加或删除的顺序决定.一旦一个数据元素被添加,它相对于前后元素一直保持该位置不变.诸如此类的数据结构被称为线性数据结构. - 线性数据结构有两端,有时被称为左右,某些情况被称为前后.你也可以称为顶部和底部,名字都不重要.将两个线性数据结构区分开的方法是添加和移除元素的方式,特别是添加和移除元素的位置.例如一些结构允许从一端添加元素,另一些允许从另一

三.基本数据结构-栈

一.线性数据结构 - 我们从四个简单但重要的概念开始研究数据结构.栈,队列,deques(双向队列), 列表是一类数据的容器,它们数据元素之间的顺序由添加或删除的顺序决定.一旦一个数据元素被添加,它相对于前后元素一直保持该位置不变.诸如此类的数据结构被称为线性数据结构. - 线性数据结构有两端,有时被称为左右,某些情况被称为前后.你也可以称为顶部和底部,名字都不重要.将两个线性数据结构区分开的方法是添加和移除元素的方式,特别是添加和移除元素的位置.例如一些结构允许从一端添加元素,另一些允许从另一