Skip to the content.

Ex31 栈的压入弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

解题思路

这道题需要一个辅助栈stk。总体的思路如下:

代码

class Solution
{
public:
  bool
  validateStackSequences (std::vector<int> &pushed, std::vector<int> &popped)
  {
    if (pushed.size () != popped.size ())
      return false;
    if (pushed.size () == 0 && popped.size () == 0)
      return true;
    std::stack<int> stk;
    std::vector<int>::iterator pushed_iter = pushed.begin (),
                               popped_iter = popped.begin ();
    while (pushed_iter != pushed.end () && popped_iter != popped.end ())
      {
        if (stk.empty ())
          {
            stk.push (*pushed_iter);
            ++pushed_iter;
          }
        while (stk.top () != *popped_iter)
          {
            stk.push (*pushed_iter);
            ++pushed_iter;
            if (pushed_iter == pushed.end ())
              break;
          }
        while (!stk.empty () && stk.top () == *popped_iter)
          {
            stk.pop ();
            ++popped_iter;
          }
        if (pushed_iter == pushed.end () && popped_iter == popped.end ())
          return true;
      }
    return false;
  }
};

结果

执行结果:通过

执行用时:16 ms, 在所有 C++ 提交中击败了83.39%的用户

内存消耗:15.1 MB, 在所有 C++ 提交中击败了23.65%的用户