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之前

  • 相关阅读:
    门面模式简述
    转:日志组件logback的介绍及配置使用方法
    spring boot项目中使用sfl4j+logbak配置
    druid相关资料
    spring boot +druid数据库连接池配置
    设计模式之Strategy模式
    转:高效代码审查的八条准则和十个经验
    SpringMVC如何解决POST请求中文乱码问题,GET的又如何处理呢?
    【其它】关于本博客的一些说明
    [THUWC2020] 自爆记
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5809914.html
Copyright © 2011-2022 走看看