栈的合理出栈顺序(列车厢调度)

列车厢调度

一道较为明显的栈的可能出栈顺序的变式题,2是栈,3是出栈序列,很水一道变式应用

        1  ======   <--移动方向
         /
 3 =====
                 2  ======   -->移动方向 

大家或许在某些数据结构教材上见到过“列车厢调度问题”(当然没见过也不要紧)。今天,我们就来实际操作一下列车厢的调度。对照上方的ASCII字符图,问题描述如下:

有三条平行的列车轨道(1、2、3)以及1-3和2-3两段连接轨道。现有一列车厢停在1号轨道上,请利用两条连接轨道以及3号轨道,将车厢按照要求的顺序转移到2号轨道。规则是:

  • 每次转移1节车厢;
  • 处在1号轨道的车厢要么经过1-3连接道进入3号轨道(该操作记为"1->3"),要么经过两条连接轨道直接进入2号轨道(该操作记为"1->2");
  • 一旦车厢进入2号轨道,就不可以再移出该轨道;
  • 处在3号轨道的车厢,只能经过2-3连接道进入2号轨道(该操作记为"3->2");
  • 显然,任何车厢不能穿过、跨越或绕过其它车厢进行移动。

对于给定的1号停车顺序,如果经过调度能够实现2号轨道要求的顺序,则给出操作序列;如果不能,就反问用户 Are(你) you(是) kidding(凯丁) me(么)?

输入格式:

两行由大写字母组成的非空字符串,第一行表示停在1号轨道上的车厢从左到右的顺序,第二行表示要求车厢停到2号轨道的进道顺序(输入样例1中第二行CBA表示车厢在2号轨道的停放从左到右是ABC,因为C最先进入,所以在最右边)。两行字符串长度相同且不超过26(因为只有26个大写字母),每个字母表示一节车厢。题目保证同一行内的字母不重复且两行的字母集相同。

输出格式:

如果能够成功调度,给出最短的操作序列,每个操作占一行。所谓“最短”,即如果1->2可以完成的调度,就不要通过1->3和3->2来实现。如果不能调度,输出 "Are you kidding me?"

输入样例1:

ABC
CBA

输出样例1:

1->3
1->3
1->2
3->2
3->2

输入样例2:

ABC
CAB

输出样例2:

Are you kidding me?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char str[100];
int str1[100],str2[100],stack[30],out[100],inout,index1,index2,top;
int main()
{
//      freopen("test.in","r",stdin);
//      freopen("test.out","w",stdout);
    int i;
    bool flag=1;
    cin>>str;
    int len=strlen(str);
    for(i=0;i<len;i++)
        str1[i]=str[i]-'A';
    cin>>str;
    for(i=0;i<len;i++)
        str2[i]=str[i]-'A';
    index1=0;
    index2=0;
    while(1)
    {
        if(index1<len and str1[index1]==str2[index2])
        {
            index1++;
            index2++;
            out[inout]=12;
            inout++;
        }
        else if(top!=0 and stack[top-1]==str2[index2])
        {
            top--;
            index2++;
            out[inout]=32;
            inout++;
        }
        else
        {
            if(index2==len)
                break;
            stack[top]=str1[index1];
            top++;
            index1++;
            out[inout]=13;
            inout++;
            if(index1>=len)
            {
                flag=0;
                break;
            }
        }
    }
    if (flag==0 or top!=0)
        printf("Are you kidding me?\n");
    else
        for(i=0;i<inout;i++)
        {
            if (out[i]==12)
              printf("1->2\n");
            else
            if (out[i]==13)
              printf("1->3\n");
            else if(out[i]==32)
                printf("3->2\n");
        }
    return 0;
}

原文地址:https://www.cnblogs.com/IamIron-Man/p/11957006.html

时间: 2024-10-13 15:15:13

栈的合理出栈顺序(列车厢调度)的相关文章

栈的基本操作 出栈与入栈

#include<stdio.h> #include<stdlib.h> #define LENGTH 100 //初始分配栈的长度 #define ADD_LEN 10 //栈长增量 typedef struct {//构造栈的数据类型 int *base; int *top; int stacksize; }SqStack; void CreateStack(SqStack &S);//初始化一个栈 void PushStack(SqStack &S,int e

判断出栈序列是否可能是某个入栈序列的出栈序列,C++

主要思想栈必须满足先进后出的规则,例如: 压入序列1,2,3,4,5 出栈序列4,3,5,1,2 设定一个Max值代表目前已经出栈的压入序列索引号最大的值 如当4出栈的时候,目前Max是4,当3出栈的时候,就查看3,4是否出栈,如果出栈就正确 当1出栈的时候,目前Max是5,就查看1~5时候出栈,这时候2还没有出栈就认为这个出栈序列不符合先进后出 #include<iostream>#include<map>#include<vector>#include<mem

栈的基本操作—出栈与入栈

#include<stdio.h> #include<stdlib.h> #define LENGTH 100 //初始分配栈的长度 #define ADD_LEN 10 //栈长增量 typedef struct {//构造栈的数据类型 int *base; int *top; int stacksize; }SqStack; void CreateStack(SqStack &S);//初始化一个栈 void PushStack(SqStack &S,int e

数据结构-顺序栈(进栈 出栈)

#include<stdio.h> #define MaxSize 10 typedef struct SqStack{ int data[MaxSize]; int top ; }SqStack; //初始化顺序栈 void initStack(SqStack &S){ S.top = -1; } //判断栈是否为空 /*栈理论上不存在为满的情况,取决于内存大小*/ int isEmpty(SqStack S){ if(S.top == -1){//top为1表示为空 return

Python 根据入栈顺利判定出栈顺序

1.读取入栈,出栈数据: 2.把数据分别转化成整数列表: 3.新建栈列表,用入栈数据进行压栈:如果栈列表不为空,并且栈顶层数据为出栈的元素:删除栈列表的顶层数据: 4.如果栈列表不为空,说明栈列表里面的元素没有删除完:那么出栈就不成功:反之,成功: 1 import sys 2 while True: 3 try: 4 a = sys.stdin.readline().strip() # 入栈 5 b = sys.stdin.readline().strip() # 出栈 6 # 转化成列表 7

安卓 碎片 如何实现类似 活动 栈的 进栈 出栈

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 碎片 的 事物管理器 内部维持了 一个双向链表结构, 可以记录每次添加的碎片和 替代的 碎片. 然后 后退的时候, 会自动 出栈. 碎片,可以容易实现 局部更新. 原来 是把多个布局 放到 活动里. 现在可以用 碎片替代. 只在需要的时候加载 碎片. 提高了性能. 碎片 可以适应不同的屏幕尺寸. 切换碎片 ,通过 添加, 隐藏,添加另一个碎片.再次切换时,隐藏当前碎片,显示另一个.

列车厢调度

1 ====== <--移动方向 / 3 ===== 2 ====== -->移动方向 大家或许在某些数据结构教材上见到过“列车厢调度问题”(当然没见过也不要紧).今天,我们就来实际操作一下列车厢的调度.对照上方的ASCII字符图,问题描述如下: 有三条平行的列车轨道(1.2.3)以及1-3和2-3两段连接轨道.现有一列车厢停在1号轨道上,请利用两条连接轨道以及3号轨道,将车厢按照要求的顺序转移到2号轨道.规则是: 每次转移1节车厢: 处在1号轨道的车厢要么经过1-3连接道进入3号轨道(该操作

数据结构经典问题——出栈顺序 转载至:canlynet微博

对于数据结构的问题,如果思路稍有不对,就容易陷入逻辑混乱.我希望自己对数据结构的理解,能够给大家一点帮助.我会将所有我有过心得的问题在我的博客上写出来,欢迎大家浏览,如果有什么不对的地方,还请大家指正,有问题可以给我留言,我会尽量解决,谢谢. 声明一下我写博客的初衷:不是炫耀,而是回报.因为我在计算机方面的知识好多都从网上找到答案,因此我也 将自己搜寻整理的材料,自己写的材料,展示到网上,算是尽一份力吧. 一个经典问题如下(不愿意看思路的可以直接看红色字体部分): 一个栈的入栈序列是a,b,c,

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名 代码如下: #i