zoukankan      html  css  js  c++  java
  • 栈的压入弹出序列(Python and C++解法)

    题目:

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

    示例 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 之前弹出。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof

    思路:

      比较两个序列,可以得出一个序列是不是栈的弹出序列的规律:

      如果下一个弹出的数字刚好是栈顶元素,则直接从栈中弹出;  

      如果下一个弹出的数字不是栈顶元素,则把压栈序列中还未入栈的数字压入栈中,这个操作直到把下一次要弹出的元素压入栈中时为止。

      如果最后栈为空,即元素全部弹出,或者弹出序列已经全部被遍历,则说明弹出顺序正确。

    Python解法:

     1 class Solution:
     2     def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
     3         lenPush, lenPop = len(pushed), len(popped)
     4         if lenPush == 0 and lenPop == 0:
     5             return True
     6         if lenPush != lenPop:
     7             return False
     8 
     9         stackPush = []
    10         i = 0  # popped的索引
    11         for num in pushed:
    12             stackPush.append(num)
    13             while len(stackPush) != 0 and stackPush[-1] == popped[i]:  # 如果栈顶元素与当前要pop的元素相同,则栈顶元素pop
    14                 stackPush.pop()
    15                 i += 1
    16         if i == lenPop:  # 如果已经全部遍历pop序列,则说明弹出序列正确
    17             return True
    18         return False

    C++解法:

     1 class Solution {
     2 public:
     3     bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
     4         int lenPush = pushed.size();
     5         int lenPop = popped.size();
     6         if (lenPush == 0 && lenPop == 0)
     7             return true;
     8         if (lenPush != lenPop)
     9             return false;
    10 
    11         int count = 0;  // popped的索引
    12         stack<int> pushStack;
    13         for (int i = 0; i < lenPush; i++) {
    14             pushStack.push(pushed[i]);
    15             while (pushStack.size() != 0 && pushStack.top() == popped[count]) {
    16                 pushStack.pop();
    17                 count++;
    18             }
    19         }
    20         if (count == lenPop)
    21             return true;
    22         return false;
    23     }
    24 };
  • 相关阅读:
    我是卡拉 上海国际工业博览会纪实(4)
    GDI+中常见的几个问题(1)
    我是卡拉 上海国际工业博览会纪实(2)
    GDI+中常见的几个问题(9)
    GDI+中常见的几个问题(3)
    我是卡拉 上海国际工业博览会纪实(7)
    贵阳的小吃
    Indigo是啥
    我是卡拉 上海国际工业博览会纪实(3)
    云计算里AWS和Azure的探究(1)
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13267757.html
Copyright © 2011-2022 走看看