栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 };