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

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

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
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值