輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的全部數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)blog
這個題目,或是固定的題目,就採用模擬以便壓棧,彈棧的過程來作。class
入棧順序,按順序依次入棧。每次入棧後,都判斷棧頂元素是否和出棧順序的是否一致。若是一致那麼先彈出棧頂元素,再次比較。直到棧頂元素和出棧順序不一致。循環
當出棧順序遍歷完之後,棧不爲空,且不能按照出棧順序彈出了。那麼表示不多是一個彈棧順序。遍歷
bool IsPopOrder(vector<int> p, vector<int> q) { if (p.size() == 0) { return true; } stack<int> st; // j表示出棧順序的第幾個 int j = 0; for (int i = 0; i < p.size(); ++i) { // 模擬入棧 st.push(p[i]); // 入棧完之後判斷 q[j]是否等於棧頂元素。須要循環判斷 while (!st.empty() && q[j] == st.top()) { // 相等就彈出 st.pop(); ++j; } } // 到最後,st中應該爲空。由於正好 j = size-1; return st.empty(); }