首先是先进后出的数据结构
https://download.tooc.xlj0.com/uploads/179/%E7%AE%97%E6%B3%95/Pasted%20image%2020231018220744.png
STL中栈的一些函数
1 2 3 4 5 6 7 8 9 10
| st.top()
st.push() st.pop()
st.empty() st.size()
|
来一道模板题
现在有n部火车,每一部火车都有一个1∼n的编号且各不相同(火车编号构成一个
排列)。现在他们按照给定的顺序排列在一条轨道上,且可以向两个方向移动,问他们
否通过一个车站,且每部火车至多进站一次,使得出站口的编号顺序变为升序?
车站是一个栈结构,位于输入队列的轨道中间,构成一个T字形,初始时火车都在车站
右侧。
如果可以输出”Yes”,如果不行输出”No”。(不带引号)
分析:就是将最后结果的排序是必须是升序的,就比如是进站的顺序是312,但是出栈的情况是123。在这里就是用栈的情况,将不符合的先存起来然后符合情况后在出栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 9;
int a[N], pos;
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
stack<int> stk;
pos = 1;
for (int i = 1; i <= n; ++i) {
while (pos <= n && (stk.empty() || stk.top() != i)) stk.push(a[pos++]);
if (stk.top() == i)
stk.pop();
else {
cout << "No" << '\n';
return;
}
}
cout << "Yes" << '\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
while (_--) solve();
return 0; }
|