zoukankan      html  css  js  c++  java
  • 栈的压入、弹出序列

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

    顺序为:push[middle]==pop[0];之后只能从middle--或middle++,一旦从end=size-1开始则只能end--。

     1 class Solution {
     2 public:
     3     bool IsPopOrder(vector<int> pushV,vector<int> popV) {
     4         int left=0;
     5         int right=0;
     6         int middle=-1;
     7         int push_size=pushV.size();
     8         int pop_size=popV.size();
     9         if(push_size!=pop_size)
    10             return false;
    11         if(push_size==0) return false;
    12         for(int i=0;i<push_size;i++){
    13             if(pushV[i]==popV[0]){
    14                 middle=i;
    15                 break;
    16             }
    17         }
    18         if(middle==-1) return false;
    19         left=middle-1;
    20         right=middle+1;
    21         int k=1;
    22         int num=push_size-1;
    23         while(left>=0&&right<push_size&&k<pop_size){
    24             if(popV[k]==pushV[left]){
    25                 k++;
    26                 
    27                 left--;
    28                 continue;
    29             }
    30             if(popV[k]==pushV[right]){
    31                 k++;
    32                right++;
    33                 continue;
    34             }
    35             if(popV[k]==pushV[num]){
    36                 while(k<pop_size){
    37                     if(popV[k]==pushV[num]){
    38                         k++;
    39                         num--;
    40                         if(num>left&&num<right)
    41                             num=left;
    42                         continue;
    43                     }
    44                     return false;
    45                 }
    46                 return true;
    47             }
    48             return false;
    49         }
    50         while(left>=0){
    51             if(popV[k]==pushV[left]){
    52                 k++;
    53                 
    54                 left--;
    55                 continue;
    56             }
    57             return false;
    58         }
    59         while(right<push_size){
    60             if(popV[k]==pushV[right]){
    61                 k++;
    62                right++;
    63                 continue;
    64             }
    65             return false;
    66         }
    67         return true;
    68     }
    69 };

    !较好的方法:

    同样的道理,push压入后,只能从当前位置pop,不然只能等下一个数压入后再pop,或等到末尾再pop。

     1 class Solution {
     2 public:
     3     bool IsPopOrder(vector<int> pushV,vector<int> popV) {
     4         if(pushV.size()!=popV.size())
     5             return false;
     6         if( 0==popV.size())
     7             return false;
     8            
     9         vector<int> s;
    10         for(int i=0,j=0;i<pushV.size();i++) 
    11           {
    12             s.push_back(pushV[i]);
    13             while(j<popV.size() && s.back()==popV[j])
    14                 {
    15                 s.pop_back();
    16                 j++;
    17             }
    18         }  
    19       return s.empty();
    20       /*    if(pushV.size() == 0) return false;
    21         vector<int> stack;
    22         for(int i = 0,j = 0 ;i < pushV.size();){
    23             stack.push_back(pushV[i++]);
    24             while(j < popV.size() && stack.back() == popV[j]){
    25                 stack.pop_back();
    26                 j++;
    27             }     
    28         }
    29         return stack.empty();*/
    30          
    31     }
    32 };
  • 相关阅读:
    pandas_处理异常值缺失值重复值数据差分
    【C语言】输入10个人的成绩,求平均值
    【Markdown】新手快速入门基础教程
    【Python】 平方根
    【Python】 数字求和
    【Python】文件下载小助手
    【Python爬虫程序】抓取MM131美女图片,并将这些图片下载到本地指定文件夹。
    【Python】爬虫原理
    C语言最重要的知识点(电子文档)
    【Python】一些函数
  • 原文地址:https://www.cnblogs.com/zl1991/p/4764809.html
Copyright © 2011-2022 走看看