数据结构——栈

题目标题:Rails 铁轨
题目来源:UVa 514
题目大意:给出一个整数n,然后将从1~n逐个入栈,但是不知道是何时出栈,下面给出n行,每一行代表一种可能的出栈序列,要求如果能够符合出栈序列,输出YES,否则输出NO。直到输入0结束。
首先给出代码。

# include <iostream>
# include <stack>
using namespace std;
int n , target[1001];
int main()
{
    while(cin>>n)
    {
        if(n==0)
            break;
        bool key=true;
        while(key)
        {
            stack<int> s ;
            int A = 1, B = 1;
            for(int i=1;i<=n;i++)
            {
                cin>>target[i];
                if(target[1]==0)
                {
                    key=false;
                    break;
                }
            }
            int ok=1;
            while(B<=n)
            {
                if(A == target[B])
                {
                    A++;
                    B++;
                }
                else if(!s.empty()&&s.top() == target[B])
                {
                    s.pop();
                    B++;
                }
                else if(A<=n)
                    s.push(A++);
                else
                {
                    ok=0;
                    break;
                }
            }
            if(key)
            if(ok)
                    cout<<"Yes"<<endl;
                else
                    cout<<"No"<<endl;
        }
    }
    return 0;
}

定义了一个栈s,并定义了A,B两个变量,其中A代表的是入栈序列,B则代表了出栈序列。当B小于n的时候,即还有剩余元素未出栈。
如果A等于输入的序列中第B个数,那么A和B同时加一,表示此时的出栈序列是对的,如果s不为空,即栈中还有元素没出栈,并且栈顶元素等于输入序列中第B个数,那么此时的出栈序列也是对的,B加一。如果不满足上述两个条件的话,只能先把A入栈,等待下一次判断是否能将A出栈了。如果A>n了,此刻已经不会再满足出栈序列了,此时应该结束循环,并且返回一个0,输出No,表示输入的出栈序列不可能实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值