C.基础数据结构--栈的应用(2)

题目

Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: * (* users) Total Accepted: * (* users) Special Judge: No
Description
给定一个从1开始的连续整数列1、2、3、4…n。
将上述数列按顺序入栈,中途栈顶元素可以出栈。再给定一个出栈序列,判断此序列是否合法。
例如,将n设为4。即得到数列1、2、3、4。再给定出栈序列1、3、4、2。
可以看出,此出栈序列合法。

过程如下,先将数列1、2、3、4中的元素1入栈,再将其出栈。
然后将元素2、3入栈,将元素3出栈。
最后将元素4入栈,再把栈内的仅余元素4、2出栈。
整个过程中,元素按照1、3、4、2的顺序出栈。证明其合法。
Input
输入包括多组测试用例。对于每组测试用例,第一行包含一个整数n<100,代表从1开始的连续整数列长度。第二行包含一个长度为n的数列,代表出栈序列。出栈序列的各元素在区间[1,n]内且不重复。
Output
若出栈序列合法,则输出Yes。否则,输出No。
Sample Input
4
1 3 4 2
Sample Output
Yes
Hint
“Yes”,"No"注意大小写
压入
弹出
不弹出

一个栈用于模拟操作,一个队列记录出栈顺序;每出栈一次,队列头部弹出,同时栈弹出(相当于弹出完成的操作)。

从给出的出栈顺序讲,每完成一个出栈记录,下一个出栈记录可能就是由“在这次出栈之前没有入栈”这个行为完成的,所以要考虑弹出一次之后要不要继续弹出。也就是存在桟上连续的弹出的情况。

Accept

#include <deque>
#include <iostream>
#include <stack>
#include <string>
void F(int n)
{
    std::deque<int> deque;
    std::stack<int> stack;
    for (int i = 1; i < n + 1; i++) {
        int t;
        std::cin >> t;
        deque.push_back(t);
    }

    for (int i = 1; i < n + 1; i++) {
        stack.push(i); // 这里模拟入栈
        for (; stack.size() != 0 && stack.top() == deque.at(0);) {
            stack.pop();
            deque.pop_front();
        }
    }

    std::string str = "";
    if (stack.size() == 0) {
        str = "Yes";
    } else {
        str = "No";
    }
    std::cout << str << std::endl;
}
int main()
{
    int n;
    for (; std::cin >> n;) {
        F(n);
    }
}

补充

本题栈的顺序是严格递增入栈的,所以在宏观上一个出栈元素的右边的出栈元素(就是比这个出栈元素晚出栈的元素)一定是递减序列的。也就是说任一元素右边比该元素小的序列一定乘递减排序。

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值