劍指Offer 面試題22 棧的壓入 彈出序列

2021-07-14 05:49:37 字數 923 閱讀 1575

題面:《劍指offer》p134 / 牛客網

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

分析清楚兩個序列的關係問題就能迎刃而解

方法1第乙個彈出棧的位置無限制,假設為cur。之後元素出棧要更新cur。

此後每乙個出棧元素有兩種選擇

1、入棧佇列cur左邊第乙個相鄰未出棧的,如4,5,3,2,1中5出棧後,左邊第乙個應該是3不能是1,所以序列4,3,5,1,2不對

2、入棧佇列cur右邊未出棧的,不需要相鄰

設定輔助bool列表記錄入棧佇列的元素是否已出棧

bool ispoporder(vectorpushv, vectorpopv) 

cur = temp;

for (int j = cur; j < n; j++)//向右遍歷查詢

}if(!hasfind)

return false;

} return true;

}

方法2借用輔助棧,根據出棧序列還原出棧過程

如4,5,3,2,1第乙個出棧是4,所以在此之前入棧序列1,2,3,4,5中4前面的1,2,3必須先入棧

bool ispoporder(vectorpushv,vectorpopv)

if (cur == n)

break;

while (cur < n&&pushv[cur] != data)

s.push(pushv[cur++]);

cur++;

}return s.empty();

}

劍指offer 面試題22 棧的壓入 彈出序列

題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設入棧的所有數字均不相等。思路 用乙個棧來模擬入棧過程。如果彈出序列的元素a不等於棧頂,那麼說明它還沒有入棧,從壓入順序裡將元素a以及它之前的元素全部入棧。如果所有壓入順序中的元素都已入棧還是沒有在棧頂找到元...

劍指offer面試題22 棧的壓入 彈出序列

題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。思路 遍歷第二個序列,如果下乙個彈出的數字剛好是棧頂數字,則直接彈出。如果不在棧頂,把壓棧序列中還沒有入棧的陣列壓入輔助棧,直到把下乙個需要彈出的數字壓入棧頂為止。如果所有的數字都壓入棧了仍然沒有找到下乙個彈出...

劍指offer 面試題22 棧的壓入,彈出序列

題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第 二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1 2 3 4 5是某棧的壓棧序列,序列4 5 3 2 1 是該壓棧序列對應的乙個彈出序列,但4 3 5 1 2就不可能是該 該壓棧序列的彈出序列。這種判斷其實只要掌握棧...