1. 程式人生 > >LeetCode946-驗證棧序列

LeetCode946-驗證棧序列

問題:驗證棧序列

給定 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 之前彈出。

 

提示:

  1. 0 <= pushed.length == popped.length <= 1000
  2. 0 <= pushed[i], popped[i] < 1000
  3. 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資料首先要判斷是否為空,陣列下標判斷是否是在合理範圍。