• 剑指offer21:第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。(注意:这两个序列的长度是相等的)


    1 题目描述

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

    2 思路和方法

      借用一个辅助栈,遍历压栈顺序,先将第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈。出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。https://blog.csdn.net/qq_28632639/article/details/88087777

    举例:

    入栈1,2,3,4,5

    出栈4,5,3,2,1

    首先1入辅助栈,此时栈顶1≠4,继续入栈2

    此时栈顶2≠4,继续入栈3

    此时栈顶3≠4,继续入栈4

    此时栈顶4=4,出栈4,弹出序列向后移一位,此时为5,辅助栈里面是1,2,3

    此时栈顶3≠5,继续入栈5

    此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3

    ….

    依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。

    3 C++核心代码

     1 class Solution {
     2 public:
     3     bool IsPopOrder(vector<int> pushV,vector<int> popV) {
     4         stack<int> s;
     5         int j = 0;
     6         for (int i = 0; i<pushV.size(); i++)
     7         {
     8             s.push(pushV[i]);//将入栈序元素入栈
     9             while (!s.empty() && s.top() == popV[j])//栈顶元素等于出栈序,则出栈
    10             {
    11                 s.pop();
    12                 j++;//出栈序下标往后移动一下
    13             }
    14         }
    15         return s.empty();
    16     }
    17 };
    View Code

    4 C++完整代码

     1 #include<iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 bool IsPopOrder(vector<int> pushV,vector<int> popV)
     6 {
     7     if(pushV.size()!=popV.size())  return false;
     8 
     9     vector<int> vecstack;
    10     for(int i = 0,j=0; i < pushV.size(); i++)
    11         {
    12              vecstack.push_back(pushV[i]);                                         //vec.push_back   在尾部加入一个数据
    13              while( j < popV.size() && vecstack.back() == popV[j])   //vc.back()    传回最后一个数据
    14                 {
    15                     vecstack.pop_back();                                                //vec.pop_back()          //删除最后一个数据。
    16                     j++;
    17                 }
    18         }
    19     return vecstack.empty();
    20 }
    21 
    22 void Print(vector<int> &myarray)
    23 {
    24     int num=myarray.size();
    25     for(int i=0; i<num;i++)
    26          cout<<myarray[i]<<"  ";
    27     cout<<endl;
    28     return;
    29 }
    30 
    31 vector<int> Arr2Vec(int myarray[],int num)
    32 {
    33     vector<int> vec;
    34     vec.clear();
    35     for(int i=0;i<num;i++)
    36         vec.push_back(myarray[i]);
    37 
    38     return vec;
    39 }
    40 int main()
    41 {
    42     int array1[]={1,2,3,4,5};
    43     int array2[]={4,5,3,2,1};
    44     int num1=sizeof(array1)/sizeof(int);
    45     int num2=sizeof(array2)/sizeof(int);
    46 
    47     vector<int> pushV=Arr2Vec(array1,num1);
    48     vector<int> popV= Arr2Vec(array2,num2);
    49 
    50     cout<<"pushV:"<<endl;
    51     Print(pushV);
    52     cout<<"popV:"<<endl;
    53     Print(popV);
    54     cout<<endl;
    55     cout<<IsPopOrder(pushV,popV)<<endl;
    56     return 0;
    57 }
    View Code

    参考资料

    https://blog.csdn.net/qq_28632639/article/details/88087777

    https://blog.csdn.net/zhenaoxi1077/article/details/80402855

  • 相关阅读:
    已知自然数A、B不互质,A、B最大公约数和最小公倍数之和为35,那么A+B的最小值是多少?
    mysql null字段 空字段 查询效率
    sql注入和网站攻击思路
    软件服务新时代:开源软件的盈利模式
    eclipse maven插件配置,jdk全局版本调整
    spring事务(isolation隔离级别,propagation事务传播属性)
    GBDT 算法
    博客园的 “随笔、文章、新闻、日记”有啥区别
    1.3 Java中的标识符和关键字
    1.1 Java 的概述
  • 原文地址:https://www.cnblogs.com/wxwhnu/p/11411256.html
Copyright © 2020-2023  润新知