1. 程式人生 > >已知一個棧的入棧序列,判斷給定的一個序列是否為其出棧序列

已知一個棧的入棧序列,判斷給定的一個序列是否為其出棧序列

思路:

(1)棧為後入先出序列

(2)將入棧序列的元素一個一個入棧然後和出序列中每個元素比較。取序列第一個元素時,把第一個序列的各個元素依次入棧,然後入棧一個後和序列元素比較,如果相同那麼將這個元素出棧,並且與序列的第二個元素再進行比較

bool IspopOrder(vector<int> pushv,vector<int> popv)

{

bool isPop=false;

if(popv.size()>0&&pushv.size()&&popv.size()==pushv.size())

{

std::stack<int> stackdata;

int i=j=0;

int length=pushv.size();

while(j<length)

{

while(stack.empty()||stack.top()!=popv[j])

{

if(i>length-1)

break;

   stack.push(pushv[i]);

      i++;

}

if(stack.top()!=popv[j])//對於這個元素在入棧序列的頂部找不到時,證明這個序列不可能為出棧序列

break;

//當棧頂的元素等於出棧序列中對應的元素時,證明這個元素可以在這個位置出棧,此時繼續觀察下一個元素,領j++

stack.pop();

j++

}

if(stack.empty()&&j==length)//當所有棧裡的元素彈出且j等於出棧序列元素數時,證明這個序列是一個合法的出棧序列

isPop=true;

}

return isPop;

}