棧和隊列的主要區別

一、棧和隊列的基本介紹

棧(Stack)和隊列(Queue)是兩種經典的數據結構,用於在計算機程序中存儲和管理數據。棧是一種後進先出(LIFO)的數據結構,只允許在棧頂進行插入和刪除操作。隊列是一種先進先出(FIFO)的數據結構,只允許在隊列尾部進行插入操作,在隊列頭部進行刪除操作。

下面是棧和隊列的簡單Python代碼實現:

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def is_empty(self):
        return len(self.items) == 0

class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        return self.items.pop(0)

    def is_empty(self):
        return len(self.items) == 0

二、基本操作的差異

棧和隊列的主要區別在於它們的基本操作。在棧中,元素的插入和刪除只能在棧頂進行,而隊列中元素的插入只能在隊列尾部進行,刪除操作則只能在隊列頭部進行。這意味著在棧中最後插入的元素會被最先刪除,而在隊列中最先插入的元素會被最先刪除。

下面是分別實現了棧和隊列的基本操作代碼:

# 棧
class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def is_empty(self):
        return len(self.items) == 0


# 隊列
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        return self.items.pop(0)

    def is_empty(self):
        return len(self.items) == 0

三、性能差異

棧和隊列的另一個主要區別是它們的性能差異。在棧中,插入和刪除操作的時間複雜度都是O(1),因為只需要操作棧頂的元素。而在隊列中,插入操作的時間複雜度也是O(1),但刪除操作的時間複雜度為O(n),因為需要將所有的元素向前移動一位。

下面是分別實現了棧和隊列的性能比較代碼:

import time

# 棧
s = Stack()
start = time.time()
for i in range(1000000):
    s.push(i)
while not s.is_empty():
    s.pop()
end = time.time()
print("Time used for Stack:", end-start)

# 隊列
q = Queue()
start = time.time()
for i in range(1000000):
    q.enqueue(i)
while not q.is_empty():
    q.dequeue()
end = time.time()
print("Time used for Queue:", end-start)

四、應用場景的不同

棧和隊列在不同的應用場景中有不同的用途。棧通常用於處理遞歸和回溯問題,以及表達式的計算和括弧匹配。隊列則常用於解決如廣度優先搜索(BFS)等問題。同時,隊列還常被用於實現具有緩衝區的數據傳輸。

下面是棧和隊列分別應用於表達式括弧匹配的代碼實現:

# 棧應用:表達式括弧匹配
def is_balanced(expr):
    s = Stack()
    for char in expr:
        if char in ['(', '[', '{']:
            s.push(char)
        elif char in [')', ']', '}']:
            if s.is_empty():
                return False
            top = s.pop()
            if not is_match(top, char):
                return False
    return s.is_empty()

def is_match(p1, p2):
    return (p1 == '(' and p2 == ')') or (p1 == '[' and p2 == ']') or (p1 == '{' and p2 == '}')

print(is_balanced("(Pangolin)[Python]"))  # True
print(is_balanced("{Python(Jupyter)}[Java]"))  # True
print(is_balanced("({Python][Jupyter)}"))  # False

# 隊列應用:BFS實現圖的遍歷
from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    visited.add(start)

    while queue:
        vertex = queue.popleft()
        print(vertex, end=" ")
        for neighbor in graph[vertex]:
            if neighbor not in visited:
                queue.append(neighbor)
                visited.add(neighbor)

graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

bfs(graph, 'A')
# 輸出:A B C D E F

原創文章,作者:ACOX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133585.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ACOX的頭像ACOX
上一篇 2024-10-03 23:59
下一篇 2024-10-04 00:00

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Python中的隊列定義

    本篇文章旨在深入闡述Python中隊列的定義及其應用,包括隊列的定義、隊列的類型、隊列的操作以及隊列的應用。同時,我們也會為您提供Python代碼示例。 一、隊列的定義 隊列是一種…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字元命令行的語言…

    編程 2025-04-29
  • RabbitMQ和Yii2的消息隊列應用

    本文將探討RabbitMQ和Yii2之間的消息隊列應用。從概念、安裝和配置、使用實例等多個方面詳細講解,幫助讀者了解和掌握RabbitMQ和Yii2的消息隊列應用。 一、Rabbi…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟體開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28

發表回復

登錄後才能評論