题目
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);
}
}
补充
本题栈的顺序是严格递增入栈的,所以在宏观上一个出栈元素的右边的出栈元素(就是比这个出栈元素晚出栈的元素)一定是递减序列的。也就是说任一元素右边比该元素小的序列一定乘递减排序。