題目:輸入兩個整數序列。其中一個序列表示棧的push順序,判斷另一個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。
比如輸入的push序列是1、2、3、4、5,那麼4、5、3、2、1就有可能是一個pop系列。因為可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,這樣得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。
[cpp]
#include <iostream>
using namespace std;
const int MAXSIZE=10;
template<class T>
class stack
{
public:
stack();
~stack();
bool push(T value);
bool pop();
bool empty();
T top();
private:
T s[MAXSIZE];//棧對應的元素
int head;//指向棧頂元素
};
template<class T>
bool stack<T>::empty()
{
return head==-1?1:0;
}
template<class T>
stack<T>::stack()
{
head=-1;
}
template<class T>
stack<T>::~stack()
{
}
template<class T>
bool stack<T>::push(T value)
{
if((MAXSIZE-1)==head){
cout<<"棧已滿"<<endl;
return false;
}
s[++head]=value;
return true;
}
template<class T>
bool stack<T>::pop()
{
if(-1==head){
cout<<"棧已空"<<endl;
return false;
}
--head;
return true;
}
template<class T>
T stack<T>::top()
{
if(-1==head)
throw 1;
else
return s[head];
}
bool Is_Pop(int *a,int *b,int len_a,int len_b)
{
if(len_a!=len_b)
return false;
stack<int> s;
int i=1,j=1;
while(j!=len_a){
//如果輸入的b數組數字有問題
if(b[j]<1 || b[j]>=len_a)
return false;
//如果數組a全部入棧,那麼依次出棧和b[j]比較
if(i==len_a){
while(!s.empty()){
if(s.top()!=b[j++])
return false;
s.pop();
}
return true;
}
if(a[i]<b[j]){
s.push(a[i++]);
}
else {
s.push(a[i]);
++i;
++j;
s.pop();
}
}
return true;
}
void main()
{
stack<int> s;
int Push[]={0,1,2,3,4,5};//從Push[1]開始
int Pop[]={0,4,3,5,1,2};//從Pop[1]開始
cout<<Is_Pop(Push,Pop,sizeof(Push)/sizeof(int),sizeof(Pop)/sizeof(int));
system("pause");
}