算法(初级):栈

2021年8月15日 16:03 阅读 1.09k 评论 0

用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

点击前往LeetCode在线练习此题:用两个栈实现队列

输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1]

算法分析: 在开始作答之前,我们得先明白栈的队列的特性,栈是先进后出的,队列是先进先出的,所以说,将元素压栈后,我们想按照队列的方式出队,就得将栈倒过来,再出栈,就是队列了

所以这道题就很简单了,我们准备两个栈,一个负责队列入队,一个负责出队

class CQueue: 

    def __init__(self): 
        self.stack1 = [] 
        self.stack2 = [] 

    def appendTail(self, value: int) -> None: 
        self.stack1.append(value) # 入队时直接压栈即可 

    def deleteHead(self) -> int: 
        if self.stack2: # 若负责出队的栈不为空 
            return self.stack2.pop() # 出队 
        if not self.stack1: # 若栈中无数据 
            return -1 
        while self.stack1: 
            self.stack2.append(self.stack1.pop()) # 将stack1中的元素压栈到stack2中 
        return self.stack2.pop() 

包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.

点击前往LeetCode在线练习此题:包含min函数的栈

算法分析: 首先我们可以直接写出栈的一些方法,与正常的不同的是我们需要一个辅助栈来维护栈的最小值,在入栈的时候主栈直接入栈,辅助栈判断当前元素是否小于末尾元素,小于则入栈

在出栈时判断主栈出栈的元素是否与辅助栈末尾的元素相等,若相等,辅助栈也需要出栈,维持两栈的一致性

class MinStack: 

    def __init__(self): 
        """ 
        initialize your data structure here. 
        """ 
        self.stack = [] 
        self.min_stack = [] 

    def push(self, x: int) -> None: 
        if not self.min_stack or self.min_stack[-1] >= x: 
            self.min_stack.append(x) 
        self.stack.append(x) 

    def pop(self) -> None: 
        if not self.stack: 
            return None 
        if self.stack.pop() == self.min_stack[-1]: 
            self.min_stack.pop() 

    def top(self) -> int: 
        return self.stack[-1] 

    def min(self) -> int: 
        return self.min_stack[-1] 

PS:以上题目均来自LeetCode

最后修改于2021年8月28日 22:40
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yangyingqi.com/54.html

微信
支付宝
登录后即可进行评论/回复