算法竞赛入门经典:第六章 数据结构基础 6.2铁轨

来源:互联网 发布:aftereffects软件下载 编辑:程序博客网 时间:2024/04/30 05:49
/*铁轨:某城市有一个火车站,铁轨铺设如图所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能再回到C了。换句话说,任意时刻,只有两种选择:A->C和C->BB                     A5,4,3,2,1             1,2,3,4,5            C思路:关键使用一个栈即可,按照顺序弹出,如果可以,应该最后栈为空输入:51 2 3 4 55 5 4 1 2 366 5 4 3 2 1输出:YesNoYes*/#include <stdio.h>#include <stdlib.h>#include <stack>using namespace std;#define MAXSIZE 1024void rail(){int n;while(EOF != scanf("%d",&n)){stack<int> stackIntRail;/*for(int i = 1; i <= n; i++){stackIntRail.push(i);}*/int iArr[MAXSIZE];int k = 1;int nCopy = n;while(n--){scanf("%d",&iArr[k++]);}int iCount = 1;//专门用来过滤相同的前缀,例如:1 2 3 4 5int iPos = 1;bool isRight = true;while(iPos <= nCopy){if(iCount == iArr[iPos])//解决顺序输出的问题,一旦iCount超过栈的大小,就不走这个分支{iPos++;iCount++;}//else if(stackIntRail.top() == iArr[iPos])else if(!stackIntRail.empty() && stackIntRail.top() == iArr[iPos])//解决一一比较的问题,每次总是拿数组元素与栈元素比较大小{stackIntRail.pop();iPos++;}else if(iCount <= nCopy)//针对逆序问题,将元素压入栈中,为第二个分支比较做准备{stackIntRail.push(iCount++);}else{isRight = false;break;}}isRight ? puts("Yes") : puts("No");}}void rail_repeat(){int n;int iArr[MAXSIZE];while(EOF != scanf("%d",&n)){for(int i = 0 ; i < n;i++){scanf("%d",&iArr[i+1]);}int iPos = 1,iCount = 1;//iPos用于标记输入数组,iCount用于计数stack<int> stackInt;bool isRight = true;//while(iCount <= n)while(iPos <= n){if(iArr[iPos] == iCount)//解决顺序问题{iPos++;iCount++;}else if(!stackInt.empty() && stackInt.top() == iArr[iPos])//解决比较问题,始终拿栈顶和数组前面的元素比较,因为相消必定拿前面的{stackInt.pop();iPos++;}//else if(iPos <= n)//解决逆序问题else if(iCount <= n){//stackInt.push(iPos++);stackInt.push(iCount++);}else{isRight = false;break;}}isRight ? puts("Yes") : puts("No");}}//模拟栈,不像队列,只需要栈顶指针,top=0表示栈空void rail(int i,int j){int n;while(EOF != scanf("%d",&n)){int m_stack[MAXSIZE];//栈必须放进循环中int iArr[MAXSIZE];int top = 0;for(int i = 0 ; i < n ; i++){scanf("%d",&iArr[i+1]);}int iPos = 1,iCount = 1;bool isRight = true;while(iPos <= n){if(iCount == iArr[iPos]){iPos++;iCount++;}else if(top && m_stack[top] == iArr[iPos]){top--;iPos++;}else if(iCount <= n){//m_stack[top++] = iCount;//m_stack[++top] = iCount;//加送取减栈,栈要先加,m_stack[1]为栈底元素,iCountm_stack[++top] = iCount++;}else{isRight = false;break;}}isRight ? puts("Yes") : puts("No");}}int main(int argc,char* argv[]){//rail_repeat();rail(1,1);system("pause");return 0;}

0 0
原创粉丝点击