杭电ACM1022(栈的使用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022

题目大意:有若干列火车按一定顺序进站,再按一定顺序出站,这个过程遵循“先进后出”的原则,因此这个车站其实就是一个栈的数据结构,要求给出一个进站的序列和一个出站的序列,如果按照给定的进站顺序可以得到给定的出站顺序,则输出“Yes.”。并按顺序输出每一列列车进出的顺序,若不能得到则输出“No.”

解题思路:用一个栈来模拟这个站台,在处理的过程中主要要完成两件事情,第一是模拟进站和出站的过程,判断最终能否得到给定的出站序列,第二是要记录下全部列车的进出顺序。

AC代码:
#include <iostream>
#include <stack>
using namespace std;
int main()
{
    int n;
    char in[100];
    char out[100];
    int flag[100];  //记录判断进站还是出站的标志
    while(cin>>n)
    {
        cin>>in;
        cin>>out;
        stack<char> s;//模拟站台的栈
        int i=0;      //i代表进站序列的对应列车
        int j=0;      //j代表出站序列的对应列车
        for(i;i<=n;)
        {
            if(s.empty())  //如果栈为空则处理第一个数据
            {
                s.push(in[i]);
                flag[i+j] = 0;
                i++;          //第一个数据入栈,计数器加一
            }
            if(!s.empty()&&s.top()!=out[j])//如果栈不空并且不等于当前出站序列中的数字,则必须再将后面的标号入栈
            {
                s.push(in[i]);
                flag[i+j] = 0;
                i++;
            }
            if(!s.empty()&&s.top()==out[j])
            {
                s.pop();
                flag[i+j] = 1;
                j++;
            }                             //如果栈不为空,并且栈顶元素等于当前出站序列中的当前位置,则出栈,并让出站序列向后,开始处理下一个出站序列
        }
        if(s.empty())                    //若栈为空,证明全部列车都已经出站,所以题目给出的出站序列有可能实现
        {
            cout<<"Yes."<<endl;
            for(i=0;i<2*n;i++)
            {
                if(flag[i]!=1)cout<<"in"<<endl;
                else cout<<"out"<<endl;
            }
            cout<<"FINISH"<<endl;
        }
        else                               //若栈不为空,说明有列车滞留在车站中,肯定不能实现题目给出的出站序列
        {
            cout<<"No."<<endl;
            cout<<"FINISH"<<endl;
        }
    }
    return 0;
}


你可能感兴趣的:(算法,栈,ACM,杭电)