LeetCode刷題之棧、隊列、堆的解題方法及相關練習

理論引述

棧Stack:先進後出的線性表
隊列Queue:先進先出的線性表
python中heapq堆的講解

a = [1,2,3,4,5]
print(a.pop())  # 結果爲5,說明彈出的是數組中的最後一個元素

習題目錄

[1]. 快樂的LeetCode — 225. 用隊列實現棧的三種解法
[2]. 快樂的LeetCode — 面試題09. 用兩個棧實現隊列
[3]. 快樂的Leetcode — 155. 最小棧 (面試題30. 包含min函數的棧)
[4]. 快樂的LeetCode — 面試題31. 棧的壓入、彈出序列
[5]. 快樂的LeetCode — 215. 數組中的第K個最大元素


1.使用隊列實現棧時,可以轉化思路爲數組順序的變換

圖解表述:

在這裏插入圖片描述
代碼表述:

class MyStack:

    def __init__(self):
        self.queue = []

    def push(self, x):
        self.queue.append(x)
        length = len(self.queue)
        for i in range(length-1):
            first = self.queue[0]
            del self.queue[0]
            self.queue.append(first)

    def pop(self):
        target = self.queue[0]
        del self.queue[0]
        return target

    def top(self):
        return self.queue[0]

    def empty(self):
        return len(self.queue) == 0

2.使用棧實現隊列

  • push(x) – 將一個元素放入隊列的尾部。
  • pop() – 從隊列首部移除元素。
  • peek() – 返回隊列首部的元素。
  • empty() – 返回隊列是否爲空。

代碼表述:

class MyQueue(object):
    def __init__(self):
        self.quene = []

    def push(self, x):
        self.quene.append(x)

    def pop(self):
        target = self.quene[0]
        del self.quene[0]
        return target

    def peek(self):
        return self.quene[0]

    def empty(self):
        return len(self.quene) == 0

3.包含min函數的棧

快樂的Leetcode — 155. 最小棧 (面試題30. 包含min函數的棧)


4.面試題31. 棧的壓入、彈出序列

關鍵點:每次入棧後,循環判斷 “棧頂元素 == 彈出序列的當前元素” 是否成立,將符合彈出序列順序的棧頂元素全部彈出。

class Solution(object):
    def validateStackSequences(self, pushed, popped):
        stack, i = [], 0
        for num in pushed:
            stack.append(num)
            while stack and stack[-1] == popped[i]:
                stack.pop()
                i += 1
        return not stack

5.數組中的第K個最大元素

快樂的LeetCode — 215. 數組中的第K個最大元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章