zoukankan      html  css  js  c++  java
  • 剑指Offer

    剑指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
    ");
    45         } else {
    46             printf("No
    ");
    47         }
    48 
    49         while (!st.empty()) {
    50             st.pop();
    51         }
    52         m2.clear();
    53     }
    54 
    55     return 0;
    56 }
  • 相关阅读:
    Java学习之Java历史版本
    小数的二进制转换
    cpp反汇编调试一
    理解 typedef 定义的函数指针
    mov 与 lea 区别
    asmlinkage的用法
    秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒)
    Java字节码例子解析
    Go程序的一生是怎样的?
    Linux内核 hlist_head/hlist_node结构解析
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3538417.html
Copyright © 2011-2022 走看看