九度oj 题目1366:栈的压入、弹出序列

题目描述:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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

这个题一开始提交的代码是这样
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 int num1[100002];
 8 int num2[100002];
 9 int n;
10 
11 stack <int> tmp;
12 
13 int main(int argc, char const *argv[])
14 {
15     while(scanf("%d",&n) != EOF) {
16         for(int i = 0; i < n; i++) {
17             scanf("%d",&num1[i]);
18         }
19         for(int i = 0; i < n; i++) {
20             scanf("%d",&num2[i]);
21         }
22         while(!tmp.empty()) {
23             tmp.pop();
24         }
25         int p1 = 0, p2 = 0;
26 
27         while(p1 < n && p2 < n) {
28             if(num1[p1] != num2[p2]) {
29                 tmp.push(num1[p1]);
30                 p1++;
31             }
32             else {
33                 p1++;
34                 p2++;
35             }
36         }
37         while(!tmp.empty()) {
38             int cp = tmp.top();tmp.pop();
39             if(p2 < n && cp == num2[p2]) {
40                 p2++;
41             }
42             else {
43                 break;
44             }
45         }
46         if(tmp.empty()) {
47             puts("Yes");
48         }
49         else {
50             puts("No");
51         }
52     }
53     return 0;
54 }

这段代码在逻辑上有问题,判断是否出栈的条件写错

修改如下

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 int num1[100002];
 8 int num2[100002];
 9 int n;
10 
11 stack <int> tmp;
12 
13 int main(int argc, char const *argv[])
14 {
15     while(scanf("%d",&n) != EOF) {
16         for(int i = 0; i < n; i++) {
17             scanf("%d",&num1[i]);
18         }
19         for(int i = 0; i < n; i++) {
20             scanf("%d",&num2[i]);
21         }
22         while(!tmp.empty()) {
23             tmp.pop();
24         }
25         int p = 0;
26 
27         for(int i = 0; i < n; i++) {
28             tmp.push(num1[i]);
29             int cp = tmp.top();
30             while(p < n && cp == num2[p]) {
31                 tmp.pop();
32                 p++;
33                 if(tmp.empty()) {
34                     break;
35                 }
36                 cp = tmp.top();
37                 
38             }
39         }
40         if(tmp.empty()) {
41             puts("Yes");
42         }
43         else {
44             puts("No");
45         }
46     }
47     return 0;
48 }

注意32行,p++必须在break之前

原文地址:https://www.cnblogs.com/jasonJie/p/5809914.html