栈和队列的应用——火车进站的排序问题

博客探讨了如何解决火车进站排序问题,确保按照指定顺序出站。通过使用栈和队列,作者提出了一种策略,即利用栈记录未出站的火车,并遵循先进后出的原则。此外,还讨论了在不同情况下需要多少条轨道来最小化排序过程中的轨道使用。文章通过实例解释了算法的工作原理,并提供了代码实现。

是学校实验课的内容,本人已上网验证过,已经有很多人发过了。

1.火车乱序输入输出

名字不太好起,内容是这样的:
输入:
4//火车数
1 2 3 4//火车进站的顺序
4 1 2 3//希望的火车出栈的顺序
如果能实现,输出可以;不能,提示不能按照上面的顺序输出。

在这里插入图片描述
火车可以在岔道口等着,但根据生活常理,后进的火车必须先走了,先进的火车才能走。(这和啥一样?)

我这里采用的方式是记录输出的火车数目,退出循环的条件是输出数目和输入的火车数相同。

用两个下标遍历进站出栈的顺序,如果是同一个火车,就直接出栈就行了,
但如果不一样,先看栈顶元素,一样就出栈,然后输出队列后移一位;不一样就把当前输入元素压栈,同时输入数组后移。
当输入数组结束了,将栈内元素全部弹出并和输出序列对比,如果不一样说明不能按给出的顺序输出,如果相同则可以。

代码:

int work(int in[],int out[],int number)
{
   
   
    int *pi=in,*po=out;
    int count=0;
    struct link* head=(struct link* )malloc(sizeof(struct link));
    head->next=NULL;
    while(count<number)
    {
   
   
        if(*pi!=*po)//
        {
   
   
            if(head->next&&head->next->data==*po)//栈顶元素与之相同
            {
   
   
                output(head);
                po++;
            }
            else//压入栈等着
            {
   
   
                input(head,*pi);
                pi++;
                count++;
            }
        }
        else//一样,往后走
        {
   
   
            pi++;
            count++;
            po++;
        }
    }
    while(head->next)//栈非空。清空栈
    {
   
   
        if(output(head)!=*po)//清空一半对不上了,impossi,并清除剩下的元素
        {
   
   
            while(head->next)
                output(head);
            free(head);
            return 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值