UVA Rails(stl-stack)

具体思路是从B方向的序列 倒推 栈C 的入栈出栈顺序,

以B方向的5,4,3,2,1为例子:从一个数字5开始,要想从栈C拿到5号车厢,5号车厢得入栈C,且5号车厢处于栈顶位置,为了保证5号车

厢在栈C中,必须把1,2,3,4,5(小于等于5的车厢)压入栈C中,入栈操作完毕后,然后取出栈顶元素,此时取出来的是5,和B

方向的第一个数字5一致,我们接着看B方向的第二个数字4,因为4号车厢已压入栈C中,所以不需要入栈操作,直接取出栈顶元素,

进行对比,此时取出来的栈顶元素正是4,符合要求,接下来看B方向的第三个数字3,后面就依次类推了

下面我们以5 4 1 2 3为例子:

还是从B方向的第一个数字开始,这个数字是5,所以依次把1 ,2,3,4,5压入栈C中,然后取出栈顶元素5,与B方向的第一个数字

5一致,然后校验B方向的第二个数字4,由于4已经入栈了,取出栈顶元素,取出来一看是4,符合,然后校验B方向第三个数字1,由于

4已经入栈了,取出栈顶元素,取出来一看是3,不等于数字1,所以 5 4 1 2 3 是一个非法序列。

由于station符合后进先出规则,可以用一个stack<int>来表示station。 然后采用模拟的规则来写,因为进入station是按照编号递增进入,所以可以用aId变量表示。 接下来就是模拟时候应该注意的条件,我们知道有以下两种情况,一种是一进来station,就出station 也就是 aId == coaches[lenB];一种是进来时还不出站,那么这时候就要s.push(aId)//压栈,但是这一种的条件呢? 我们如果可以排除掉第一种,那么无非就是第二种了。但是我们要知道,在进站之前,如果站台里有车它是可以先出站的 ,这种状态就条件就是 !s.empty() && s.top() == coaches[lenB].所以只要按照顺序判断这几个条件 就可以写出这个模拟程序了。

入栈 1 2 3 4 5 int A=1(静态栈顶指针)

出栈 5 4 3 2 1 int B=1(数组计数器)

将A压入栈 5 4 3 2 1 A

取栈顶元素 (A++)5 4 3 2 1== (B++)5 4 3 2 1 √

入栈 1 2 3 4 5 A

出栈 5 4 1 2 3 B

将A压入栈 5 4 3 2 1

取A栈顶元素 5==5 与B顺序对比

4==4

3!=1... ×

//特殊情况

入栈 1 2 3 4 5 A

出栈 1 2 3 4 5 B

将A压入栈 5 4 3 2 1?

//特殊情况

if(入栈顺序==出栈顺序)

向后遍历一下

if(A==t[B])

{

A++;

B++;

}

//普通情况

else if(栈非空 and 栈顶元素与出栈的火车相同)

出栈(s站

出栈的向后遍历一下(火车序号

else if( !s.empty() && s.top()==t[B] )

{

s.pop();

B++;

}

else if(栈头未遍历结束/进栈与出栈顺序不同)

将A压入栈push(A++)

else if( A<=n )

{

s.push(A);

A++;          //等价s.push(A++);

}

否则不满足 No

else

{

flag=0;         //不满足出栈顺序

break;

}

时间: 2024-10-31 18:41:06

UVA Rails(stl-stack)的相关文章

详解括号匹配问题(STL stack)

1. 括号匹配的四种可能性: ①左右括号配对次序不正确 ②右括号多于左括号 ③左括号多于右括号 ④左右括号匹配正确 2. 算法思想: 1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈: 2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断: 3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出: 4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出: 5.字符串循

URAL 1654. Cipher Message (STL stack)

1654. Cipher Message Time limit: 1.0 second Memory limit: 64 MB Müller tried to catch Stierlitz red-handed many times, but alwaysfailed because Stierlitz could ever find some excuse. Once Stierlitz waslooking through his email messages. At that momen

UVA 10474:Where is the Marble?(STL初步)

 Where is the Marble?  Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers written on them. At the beginning, Raju would place the marbles one after another in ascending order of the numbers written on them. Then Mee

如何从 0 开始学 ruby on rails (漫步版)

如何从 0 开始学 ruby on rails (漫步版) ruby 是一门编程语言,ruby on rails 是 ruby 的一个 web 框架,简称 rails. 有很多人对  rails 感兴趣,但又不知道从何下手.学习路线是什么,因为在多个场合下回答过类似问题,所以决定整理成文章供大家参观. 有很多人选择直接学习 rails,在学习使用 rails 的过程中学习 ruby.但我觉得这有些本末倒置,我更推崇先学 ruby 再学 rails,在对 ruby 有了一定的了解后再学 rails

【ThinkingInC++】26、下推栈(push_down stack)不会越出内存

头文件 /** * 功能:下推栈(push_down stack)不会越出内存 * 时间:2014年8月18日08:13:36 * 作者:cutter_point */ #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED struct Stack { struct Link { void* data; //这个结构的数据 Link* next; //这个指向这种结构的指针 void initialize(void* dat, Link* nxt);

uva 11997 (基础数据结构)

题意: 有一个k*k 的方阵,让你从当中每一行挑选一个数字相加最后能得到K^K次方的和,输出其中最小的k个. 思路:先对每一行排序然后两两归并,每次取前k个再和下一行再进行归并.在归并的时候用一个优先队列维护最大的k个值每次先放k个进去然后一次每行和队顶比较,若是小则替换否则break最后输出即可. 代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <

UVA 10054(DFS_G题)解题报告

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=995 ------------------------------------------------------------------------------------------------------------------------------------------

uva 1001(最短路)

题意:在一个三维的奶酪里面有n(n<=100)个洞,老鼠A想到达老鼠B的位置,在洞里面可以瞬间移动,在洞外面的移动速度为10秒一个单位,求最短时间 题解:如果两个洞相交,那么d[i][j]=0:如果不相交,那么d[i][j]=dist-(r[i]+r[j]),dist为这两个洞圆心之间的欧几里得距离 再用Dijkstra处理就可以了 #include <cstdio> #include <iostream> #include <sstream> #include

Aizu 1298,UVA 10256(凸包相交)

给两类点,问是否存在一条直线把两类点划分,满足:1. 直线上没有点:2. 一类点在直线一侧,另一类点在直线另一侧. 这种题嘛,把两类点分别求个凸包,然后判断两个凸包是否有交点就行了.分析下,考虑两个凸包点数都>=3的时候,只需要判断,一,A凸包的点是否在B上或内部,反之要盼,二,是否有A凸包的一个线段和B凸包的一个线段相交.当存在一个凸包点数<=2的时候,会有点麻烦,但可以找到一个简便的方法,不需要讨论太多的方法,来解决.(最坏也就是枚举嘛,点和点,点和直线,点和凸包,直线和直线,直线和凸包,