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数据首先要判断是否为空,数组下标判断是否是在合理范围。

猜你喜欢

转载自www.cnblogs.com/youdias/p/10015934.html