剑指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

原文地址:https://www.cnblogs.com/wxwhnu/p/11411256.html