LeetCode946-驗證棧序列
阿新 • • 發佈:2018-11-25
問題:驗證棧序列
給定 pushed
和 popped
兩個序列,只有當它們可能是在最初空棧上進行的推入 push 和彈出 pop 操作序列的結果時,返回 true
;否則,返回 false
。
示例 1:
輸入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 輸出:true 解釋:我們可以按以下順序執行: push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
輸入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] 輸出:false 解釋:1 不能在 2 之前彈出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed
是popped
的排列。
連結:https://leetcode-cn.com/contest/weekly-contest-112/problems/validate-stack-sequences/
分析:
給出push順序,判斷給出的pop順序是否合理,那麼只需要用stack儲存資料,依次push資料,然後判斷棧頂是否可以pop即可,最終看stack是否為空(pushed.length==popped.length)。
流程:
push一個數字,然後儘可能的pop,直到不能pop為止,然後push下一個數字,直到push完所有。
AC Code:
class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { bool ret = false; stack<int> tmpstack; int popindex = 0; for (int i = 0; i < pushed.size(); i++) { tmpstack.push(pushed[i]); while (tmpstack.empty()==false && tmpstack.top() == popped[popindex]) { popindex++; tmpstack.pop(); } } if (tmpstack.empty() == true) { ret = true; } return ret; } };
其他:
1.第一code:
typedef long long ll; typedef vector<int> VI; typedef pair<int,int> PII; #define REP(i,s,t) for(int i=(s);i<(t);i++) #define FILL(x,v) memset(x,v,sizeof(x)) const int INF = (int)1E9; #define MAXN 100005 class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { reverse(popped.begin(), popped.end()); VI stk; REP(i,0,pushed.size()) { stk.push_back(pushed[i]); while (stk.size() && popped.size() && stk.back() == popped.back()) { stk.pop_back(); popped.pop_back(); } } if (popped.size()) return false; return true; } };
2.對資料進行操作的時候,一定要防止越界,比如stack獲取top資料首先要判斷是否為空,陣列下標判斷是否是在合理範圍。