火车



题目:


分析:

这道题目火车进出站的顺序是先进后出,和栈一样,所以可以用元素进出栈来模拟火车进出站。首先要注意的是这题的输入的进出序号是两串字符串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;
}


原文地址:https://www.cnblogs.com/jiuweilinghu/p/5943566.html