zoukankan      html  css  js  c++  java
  • 火车



    题目:


    分析:

    这道题目火车进出站的顺序是先进后出,和栈一样,所以可以用元素进出栈来模拟火车进出站。首先要注意的是这题的输入的进出序号是两串字符串in和out,所以应该把栈的类型定为char,由于如果可以调整,还要输出出入站顺序,所以还需要一个数组output来记录。现在我们就来看看怎么确定是否能够调整。in和out分别表示的是进站顺序和出站顺序,如果能同时满足这两个顺序,就说明是可调整的。每辆火车都恰好进出一次,也就意味着如果能调整,那么最后车站应该是没有车的。对应于栈来说就是栈为空。那么这道题就相当于这样一个模型:通过in和out两个序列来控制in序列各元素进出栈,判断经过若干次操作后,栈是否为空。操作就两种,一种进栈,一种出栈。i从in序列最左边开始,j从out最左边开始,进栈条件是栈为空或者out[j]不等于栈顶元素,output记录‘in’,i++;出栈条件为栈顶元素和out[j]相等,output记录'out',j++。接下来就是确定什么时候结束这些操作。要进栈的元素只在in中,当i已经走过in的最右边时(i>=n),有三种情况,一是栈恰好为空,说明所有元素都已经进出一次了,这时可以结束并且判定结果是可以调整;二是栈不为空且栈顶元素不等于out[j],那么本来这时候是要进栈一个元素,可是in已经到头了,没有可以进栈的元素,这时候就结束操作,由于栈不为空,所以不能调整;还有一种情况是栈不为空,但是栈顶元素却等于out[j],这时候出栈操作还能进行,可以继续,直到遇到前两种情况为止。这样就能判断是否能够调整了。最后只要根据判断结果决定是否输出output记录的各个值就好了。


    代码:

    #include<iostream>
    #include<stack>
    #include<string> 
    using namespace std;
    
    int main()
    {
        int n, i=0, j=0, k=0;
        string in,out,output[18];
        stack<char>s;
    
        cin >> n;
        cin>>in;
        cin>>out;
        
        while (1)
        {
            if (s.empty())
            {
                if (i < n)
                {
                    s.push(in[i]);
                    i++;
                    output[k]="in";
                    k++;
                }
                
                else
                    break;
    
            }
            else if (!s.empty())
            {
                if (s.top() == out[j])
                {
                    s.pop();
                    j++;
                    output[k]="out";
                    k++;
                }
                else if (s.top() != out[j] && i < n)
                {
                    s.push(in[i]);
                    i++;
                    output[k]="in";
                    k++;
                }
                else if (i = n&&s.top() != out[j])
                    break;
            }
        }
    
        if (!s.empty())
            cout << "No" << endl;
        else
        {
            cout<<"Yes"<<endl;
            
            for(i=0;i<k;i++)
                cout<<output[i]<<endl;	
        }
    
        return 0;
    }
    


  • 相关阅读:
    面向对象三 组合 特殊成员
    面向对象二 成员 嵌套
    面向对象
    模块和包
    异常处理
    os模块和序列化模块
    常用模块一
    常用模块 re模块
    内置函数二
    Algs4-2.2.14归并有序的队列
  • 原文地址:https://www.cnblogs.com/jiuweilinghu/p/5943566.html
Copyright © 2011-2022 走看看