UVA - 514 Rails

本文通过使用栈数据结构解决了一个关于数列重组的问题。通过对输入的数列进行处理,判断是否可以通过栈操作达到目标数列的顺序。文章分享了作者对于栈的理解及应用心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <stack>


using namespace std;
const int MAXN = 1000 + 10;


int n, target[MAXN];


int main()
{
    while(~scanf("%d", &n) && n)
    {
        while(~scanf("%d", &target[1]) && target[1])
        {
            stack<int> s;
            int A = 1, B = 1;
            for(int i = 2; i <= n; i++)
                scanf("%d", &target[i]);
            int ok = 1;
            while(B <= n)
            {
                if(A == target[B]) { A++; B++; } //若满足输入所示要求,则直接到B端
                else if(!s.empty() && s.top() == target[B]) { s.pop(); B++; } //若不满足且栈不为空,则出栈
                else if(A <= n) s.push(A++); //若不满足且栈为空,则入栈
                else { ok = 0; break; } //若三个都不满足则说明无法重组,ok = 0
            }
            printf("%s\n", ok ? "Yes" : "No");
        }
        printf("\n");
    }
    return 0;

}

心得:刚做这题时感觉有别的做法,就搜了下报告,结果网上基本都是一样的做法,就是改了个变量名= =,面对这种现象,我只想说,玩一两次还是可以的,玩多了就没意思了。。。

回归正题,LRJ大牛的代码还是一如既往的无可挑剔,选择、条件和变量都用的恰到好处,实在佩服。。。

借这道题我也发表下我自己对栈的理解:本来想按照别的做法,因为这无非就是两个有序数列的组合嘛。后来想想不对,第一个不符合的元素永远不可能排在第二、三个不符合元素的前面。然后想用下别的方法限制下,没想出来= =,看来栈就是前人为了解决这样的问题而留给我们的宝贵遗产,这也就是所谓的数据结构!!!刚开始我还不信,试了几组数据才体会到栈的精妙,拿1,2,3,4,5的例子来说,输出5,4,3,2,1、4,5,3,2,1、3,4,5,2,1,只要出栈顺序是可能的,凡是不满足第一个条件的全满足第二个条件,相当于两个数列按照题目所给方式合并,这完全不是凭空能想出来的算法。总之相当于有条件数列合并的简化版,大大简化了我们的算法~

感想虽不多不过还是想写出来,不喜轻喷= =

补充下,LRJ的代码有点问题,想必是想让我们好好看代码吧= =


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值