剑指Offer - 九度1366 - 栈的压入、弹出序列
2014-02-05 20:41
- 题目描述:
-
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
- 输入:
-
每个测试案例包括3行:
第一行为1个整数n(1<=n<=100000),表示序列的长度。
第二行包含n个整数,表示栈的压入顺序。
第三行包含n个整数,表示栈的弹出顺序。
- 输出:
-
对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出Yes,否则输出No。
- 样例输入:
-
5 1 2 3 4 5 4 5 3 2 1 5 1 2 3 4 5 4 3 5 1 2
- 样例输出:
-
Yes No
题意分析:
给定一个入栈的数列,判断给定的另一个数列是否可能是一个出栈序列。
要做的第一件事,就是将a[1],a[2],...,a[n]和1,2,...,n进行映射。这样方便判断大小,找到一个判断先后顺序的参照标准。
接下来,问题就转化成了:如果入栈序列为1,2,...,n,出栈顺序是否可能为a[1],a[2],...,a[n]?
具体的思路请直接看代码,几个if分支的意思应该比较明确了。过程中需要一个栈来模拟入栈出栈过程。
时间复杂度为O(n),空间复杂度也是O(n)。
1 // 688864 zhuli19901106 1366 Accepted 点击此处查看所有case的执行结果 6504KB 916B 640MS 2 // 201402012335 3 #include <cstdio> 4 #include <map> 5 #include <stack> 6 using namespace std; 7 8 map<int, int> m2; 9 stack<int> st; 10 const int MAXN = 100005; 11 int a[MAXN]; 12 13 int main() 14 { 15 int i, j, n; 16 int tmp; 17 18 while (scanf("%d", &n) == 1) { 19 for (i = 0; i < n; ++i) { 20 scanf("%d", &tmp); 21 m2[tmp] = i; 22 } 23 for (i = 0; i < n; ++i) { 24 scanf("%d", &tmp); 25 a[i] = m2[tmp]; 26 } 27 28 i = j = 0; 29 while (j < n) { 30 if (a[j] == i) { 31 ++i; 32 ++j; 33 } else if (!st.empty() && st.top() == a[j]) { 34 st.pop(); 35 ++j; 36 } else if (i < n) { 37 st.push(i); 38 ++i; 39 } else { 40 break; 41 } 42 } 43 if (i == n && j == n && st.empty()) { 44 printf("Yes\n"); 45 } else { 46 printf("No\n"); 47 } 48 49 while (!st.empty()) { 50 st.pop(); 51 } 52 m2.clear(); 53 } 54 55 return 0; 56 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)