题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第
二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1
是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该
该压栈序列的弹出序列。
这种判断其实只要掌握栈的先进后出原则,则不难解决。
本题的题解步骤如下:
1.设置一个辅助栈S,用于模拟出栈入栈顺序,设入栈顺序序列为pPush,出栈顺序序列为pPop
2.设置两个索引或指针分别指向入栈序列和出栈序列的第一个元素
3.顺序索引入栈元素,当入栈元素不等于出栈元素的时候,将入栈元素依次压入辅助栈S
4.当两者相等的时候,压入该元素到辅助栈S中同时将栈顶元素出栈,出栈入栈序列的索引均向后移动一个位置
5.当入栈序列索引结束之后,pPush剩余的元素全部已压入栈S
6.依次索引pPop如果pPop与辅助栈顶元素比较如果相等这将辅助栈顶弹出
7.当栈中所有的元素均弹出的时候则说明出栈顺序序列与正好是入栈顺序序列对应的出栈顺序。否则出栈顺序与入栈顺序不匹配。
代码实现如下:
1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 bool IsPopOrder(const int* pPush,const int* pPop,int nLength) 6 { 7 stack<int> S; 8 int p1=0,p2=0; 9 10 while(p1<nLength) 11 { 12 13 if(pPush[p1]!=pPop[p2]) 14 { 15 S.push(pPush[p1]); 16 p1++; 17 } 18 else 19 { 20 S.push(pPush[p1]); 21 S.pop(); 22 p1++; 23 p2++; 24 } 25 26 } 27 28 while(p2<nLength) 29 { 30 if(pPop[p2]==S.top()) 31 { 32 S.pop(); 33 p2++; 34 } 35 else 36 { 37 return false; 38 } 39 } 40 41 return true; 42 } 43 44 int main() 45 { 46 int pPush[5]={1,2,3,4,5}; 47 int pPop[5]; 48 int len=5; 49 50 cout<<"Please input the sequence of Out stack: "; 51 for(int i=0;i<len;i++) 52 { 53 int data=0; 54 cin>>data; 55 pPop[i]=data; 56 57 } 58 59 if(IsPopOrder(pPush,pPop,len)) 60 { 61 cout<<"The out sequence is right."<<endl; 62 } 63 else 64 { 65 cout<<"The out sequence is wrong."<<endl; 66 } 67 68 return 0; 69 }
运行截图: