1. 程式人生 > >22題:棧的壓入、彈出順序

22題:棧的壓入、彈出順序

題目描述

輸入兩個整數序列,第一個序列表示棧的壓入序列,請判斷第二個序列是否是棧的彈出序列。假設壓入棧的所有數字均不相等。例如序列1、2、3、4、5是某棧的壓棧序列,序列4、5、3、2、1是該壓棧序列對應的一個彈出序列,但4、3、5、1、2就不可能是該壓棧序列的彈出序列。‘

思路分析

首先考慮這個問題肯定是需要一個輔助棧,方便後邊講思路,我們將壓入序列稱為pushV,彈出序列稱為popV,按照pushV將資料壓入棧,壓入一個數據就比較棧頂資料是否是popV中的第一個數,如果是,就將該棧頂資料pop掉,然後繼續壓入,並進行比較。
為了進行比較,我們需要一個輔助的vector來存放從棧內pop掉的資料,最後將這個vector和popV進行比較,如果順序相同,說明popV是該棧的一個彈出序列,否則就不是。

下面畫圖分析下思路:(以上邊的例子說明)
pushV:1、2、3、4、5
popV:4、5、3、2、1

這裡寫圖片描述

現在以popV的序列為4、3、5、1、2分析:

這裡寫圖片描述

綜上分析過程:說明當棧不為空且棧頂資料和當前popV序列中的資料不相等時迴圈結束。

程式碼實現:

bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
    if (pushV.empty() || popV.empty())
        return false;

    stack<int> s;
    vector
<int>
compV; //將s的出棧順序儲存在該vetcor中,最後和popV比較 vector<int>::iterator it1 = pushV.begin(); vector<int>::iterator it2 = popV.begin(); while (it1 != pushV.end()) { s.push(*it1); it1++; while(!s.empty() && s.top()==*it2) { compV.push_back(s.top()); s.pop(); it2++; } } if
(!s.empty() && s.top()!=*it2)//如果棧s內有資料,但棧頂資料不是當前it2的資料,說明不是出棧順序 return false; it2 = popV.begin(); vector<int>::iterator it = compV.begin(); while (it2!=popV.end() && it!=compV.end()) //比較comp和popV,如果有任意一個不同則表明popV不是出棧順序 { if (*it2 != *it) return false; it2++; it++; } return true; }