https://ac.nowcoder.com/acm/contest/22669/D
这次直接ac,很爽
判断入栈后出栈序列的基本模板,需要熟练掌握
判断排列是否可行:
初始化 j = 1,表示当前需要匹配的排列序列下标。
for 循环遍历从 1 到 n 的车厢号,模拟将车厢入栈。
每次入栈后,通过 while 循环检查栈顶是否与 in[j] 匹配:
若匹配,说明车厢可以出栈,与目标顺序一致,因此将 j++,继续检查下一个目标车厢。
若不匹配,则继续入栈,直到车厢顺序符合要求或到达无法匹配的情况。
@Credit 迟缓的小章鱼在打卡
using namespace std;
int n;
bool end(){/*end函数用来接收每一个入栈序列的总数,
若是0则直接跳过循环*/cin >> n ;if (n) return true;else return false;
}
int in[1010];
int main(){while (end()){int k;stack<int> rails;cin >> k;/*k用来接收一个入栈序列块里的结束或者继续信号,下面while循环末尾也有一个k的cin接收,结合起来作为信号来结束一个入栈序列块的判断*/while (k) {while(!rails.empty()){rails.pop();}/*清空rails栈,很关键*/in[1] = k;/*这里in数组的初始化有一点不一样,因为第一个元素作为信号k参与结束判断,所以第一个元素初始化比较特殊*/for (int i = 2 ; i <= n ; i ++ ){cin >> in[i];}int j = 1 ;for (int i = 1 ; i <= n ; i ++ ){/*这里就是判断入栈后出栈序列的基本模板,需要熟练掌握*/rails.push(i);while(!rails.empty() && rails.top() == in[j]){rails.pop();j ++ ;}}if (rails.empty()) cout << "Yes" << endl;else cout << "No" << endl;cin >> k;if (k == 0) cout << endl;}}return 0;
}作者:迟缓的小章鱼在打卡
链接:https://www.nowcoder.com/discuss/623665475055083520
来源:牛客网