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