• 数据结构 station


    问题描述

      一天,小 L 突然对列车的进出站问题产生了兴趣,如下图所示:
    列车只能从 A 进站,或从 B 出站。
    列车从 A 进站,进站顺序为 1, 2, 3, 4, 5
    列车从 B 出站,出站顺序为 5, 4, 3, 2, 1
    现在,小 L 想知道:
    列车从 A 进站,进站顺序为 1~n
    列车从 B 出站,给定出站的顺序,判断是否可能按照这个顺序出站

    数据输入
      第一行一个正整数 n1<=n<=1000)。
      第二行包含 n 个正整数,为 1~n 的某个排列

    数据输出
      若能够按照给定的顺序出站,输出”YES” (没有引号)
      否则,输出” NO” (没有引号)

    解题思路

      思路一:判断出栈序列中,比本数小的数是否按降序排列

          时间复杂度O(n^2),本题1<=n<=1000,可用

          易写,不易错,效率低

      思路二:使用栈模拟进栈出栈

          时间复杂度O(n)

          易写错,效率高

    code

      solve 1

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 bool popAble(int *p,int len)
     5 {
     6     int i,j;
     7     for(i=0; i<len-1; i++)
     8     {
     9         int last = p[i];
    10         for(j=i+1;j<len;j++)
    11         {
    12             if(p[j]<p[i])
    13             {
    14                 if(p[j]<last)
    15                     last = p[j];
    16                 else
    17                     return false;
    18             }
    19         }
    20     }
    21     return true;
    22 }
    23 
    24 int main()
    25 {
    26     int n,i;
    27     scanf("%d", &n);
    28     int *p = (int *)malloc(sizeof(int)*n);
    29     for(i=0; i<n; i++)
    30         scanf("%d", p+i);
    31     
    32     if(popAble(p,n))
    33         printf("YES
    ");
    34     else
    35         printf("NO
    ");
    36     
    37     free(p);
    38     return 0;
    39 } 

      

       solve 2

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #define ERROR 0x7fffffff 
     5 #define TYPE int
     6 
     7 class MyStack//std::stack
     8 {
     9 public:
    10     MyStack(int _maxsize):maxsize(_maxsize),size(0){arr = (TYPE *)malloc(sizeof(TYPE)*maxsize);}
    11     ~MyStack() { free(arr); }
    12     bool empty() { return size==0; }
    13     TYPE top() { return arr[size-1]; }//每次用top()前应先调用empty(),判断是否为空 
    14     void pop() { --size; }//本题掉pop()前都有调top()与empty(),可保证不为空 
    15     void push(TYPE num) { arr[size++] = num; }//构造传入maxsize,保证不爆栈 
    16 private:
    17     int maxsize;
    18     int size;
    19     TYPE *arr;
    20 };
    21 
    22 
    23 
    24 int main()
    25 {
    26     int n,i,j;
    27     scanf("%d", &n);
    28     int *p = (int *)malloc(sizeof(int)*n);//若想再省空间,此数组可省,但可读性降低 
    29     MyStack s(n);
    30     
    31     
    32     for(i=0; i<n; i++)
    33         scanf("%d", p+i);
    34     
    35     for(i=1,j=0;i<=n;)
    36     {
    37         if(i==p[j])
    38         {
    39             i++;
    40             j++;
    41         }
    42         else if(!s.empty() && s.top()==p[j])
    43         {
    44             s.pop();
    45             j++;
    46         }
    47         else
    48         {
    49             s.push(i);
    50             i++;
    51         }
    52     }
    53     
    54     while(!s.empty())
    55     {
    56         if(s.top()==p[j])
    57         {
    58             j++;
    59             s.pop();
    60         }
    61         else
    62         {
    63             printf("NO
    ");
    64             free(p);
    65             return 0;
    66         }
    67     }
    68     printf("YES
    ");
    69     
    70     free(p);
    71     return 0;
    72 } 
  • 相关阅读:
    零碎知识点
    安卓内存泄漏8种可能
    检测内存泄漏
    kotlin协程
    webview
    安卓各布局优缺点
    splice方法
    angular服务使用
    CSS3的一些笔记
    let、var、const
  • 原文地址:https://www.cnblogs.com/cbattle/p/7633423.html
Copyright © 2020-2023  润新知