1 条题解
-
0
题意:注意 题目给出的顺序是出栈顺序 1.我门这道题其实就是要判断,出栈顺序是否合理? 2.中间站看作是一个stack (现进后出 后进先出的特点) 3.他强调车厢分裂 是想要告诉我们 一辆车可以立刻进立刻出,可一旦进入之后不出来 就要等到在栈位置中的上一辆车出去才可以出去 4.因为这个上面这个特点,所以才会有两个正确的出栈顺序12345(每一辆车立刻进了立刻出)和654321(所有车不出等到最后一起出) 5.特别强调:车的入栈顺序 永远都是123456…n 6.其次呢 stack的基本操作:pop pushback empty 7.最后呢 注意输入输出问题
解题思路
栈模拟:使用栈来模拟压入和弹出操作。 顺序验证:依次将数字压入栈中,并检查栈顶是否与目标序列的当前元素匹配。 每个样例一行输入,第一个数代表底数第二个数是系数,以此类推,读到换行符结束,问这行样例最后组成的数字的值减一,将其质因数从大到小输出。跑一边埃氏筛选法筛选出素数,然后再把读入的样例转换为数值后就可以分解了。
代码分析
输入处理: 读取输入的整数 n,表示序列的长度。 读取 n 个整数,存储在数组 a 中。 栈操作: 使用栈 s 来模拟压入和弹出操作。 依次将数字压入栈中,每次压入后检查栈顶是否与目标序列的当前元素匹配。 如果匹配,则弹出栈顶元素,并继续检查下一个目标元素。 结果判断: 如果所有目标元素都能匹配,则输出 "Yes"。 否则,输出 "No"。
原理
栈的特性:栈是后进先出(LIFO)的数据结构,每次只能操作栈顶元素。 顺序验证:通过模拟压入和弹出操作,验证目标序列是否符合栈的出栈顺序。
实现步骤
读取输入: 读取整数 n,表示序列的长度。 读取 n 个整数,存储在数组 a 中。 栈初始化: 初始化一个空栈 s。 模拟操作: 依次将数字压入栈中。 每次压入后,检查栈顶是否与目标序列的当前元素匹配。 如果匹配,则弹出栈顶元素,并继续检查下一个目标元素。 结果输出: 如果所有目标元素都能匹配,则输出 "Yes"。 否则,输出 "No"。
#include<bits/stdc++.h> #include<stack> const int N = 1010; int n; int a[N]; using namespace std; int main() { while (scanf("%d", &n) && n != 0) { while (true) { int k; scanf("%d", &k); if (k == 0)break; else a[0] = k; for (int i = 1; i < n; i++) { scanf("%d", &a[i]); } int x = 0; stack<int>s; for (int i = 0; i < n; i++) { s.push(i + 1); while (!s.empty() && s.top() == a[x]) { s.pop(); x++; } } if (x == n)printf("Yes\n"); else printf("No\n"); } printf("\n");//也同时意味着进入下一个关于n辆车出栈顺序的测试 } printf("\n"); }
- 1
信息
- ID
- 364
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者