zoukankan      html  css  js  c++  java
  • 九度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之前

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5809914.html
Copyright © 2011-2022 走看看