棧:先進後出的數據結構

一、棧的基本定義

棧(Stack)是一種線性數據結構,它按照先進後出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後入棧的數據最先彈出)。棧可以簡單地看做是一種限制性的單向鏈表,它限制了只能在鏈表的一端進行插入和刪除操作,這一端稱之為棧頂(top),另一端稱之為棧底(bottom)。

二、棧的操作

對棧的操作主要有兩個:壓入和彈出。在棧中壓入元素的操作稱為push,而彈出元素的操作稱為pop。

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

    def push(self, item):
        # 壓入元素
        self.stack.append(item)

    def pop(self):
        # 彈出元素
        if not self.is_empty():
            return self.stack.pop()

    def peek(self):
        # 返回棧頂元素
        if not self.is_empty():
            return self.stack[-1]

    def size(self):
        # 返回棧大小
        return len(self.stack)

    def is_empty(self):
        # 判斷棧是否為空
        return len(self.stack) == 0

三、棧的應用

1. 表達式求值

棧可以用來求表達式的值,由於表達式的優先級問題,我們需要把中綴表達式轉化為後綴表達式。比如a+b*c-d,可以轉化為abc*+d-

def evaluate_postfix_expression(expression: str) -> int:
    stack = Stack()
    for i in expression:
        if i.isdigit():
            stack.push(i)
        else:
            num2, num1 = int(stack.pop()), int(stack.pop())
            if i == '+':
                stack.push(num1 + num2)
            elif i == '-':
                stack.push(num1 - num2)
            elif i == '*':
                stack.push(num1 * num2)
            elif i == '/':
                stack.push(num1 / num2)
    return stack.pop()

2. 括號匹配

棧也可以用來匹配括號,比如,判斷括號序列是否合法,(()())合法,(()非法。

def is_valid_brackets(s: str) -> bool:
    stack = Stack()
    for i in s:
        if i == '(':
            stack.push(i)
        elif i == ')':
            if stack.is_empty():
                return False
            else:
                stack.pop()
    return stack.is_empty()

3. 函數調用的系統棧

函數的調用關係也可以看做是一種棧的結構,每當一個函數被調用時,系統就會在棧頂記錄下來當前的函數調用信息,同時棧指針上移一位,而在一個函數執行完以後,棧頂的函數返回並彈出,此時系統將把執行權向下移交給當前的棧頂函數。

四、棧的優缺點

1. 優點

1. 棧能夠保證基本操作的時間複雜度為O(1)。

2. 棧是一種先進後出的數據結構,特別適用於需要倒序輸出或倒序執行操作的場景。

3. 棧可以解決一些複雜的問題,比如函數調用等。

2. 缺點

1. 棧的空間固定,一旦棧滿就不能再去push數據,容易產生棧溢出的問題。

2. 棧的操作受限,只有棧頂元素可以進行操作,其他位置的元素不能進行操作。

3. 棧不支持隨機訪問,只能從棧頂往下遍歷。

五、總結

本文詳細介紹了棧的定義、操作、應用及其優缺點,棧是一種非常重要和實用的數據結構,廣泛應用於計算機科學領域。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KIMHZ的頭像KIMHZ
上一篇 2025-04-12 01:13
下一篇 2025-04-12 01:13

相關推薦

  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 數據結構學生成績管理系統

    在現代教育中,學生成績的管理已經成為了一個不可或缺的部分。藉助數據結構,一個高效、可靠的學生成績管理系統可以被輕鬆實現。 一、數據結構的選擇 在構建學生成績管理系統時,選擇合適的數…

    編程 2025-04-29
  • Python方陣:一種便捷高效的數據結構

    Python方陣是一種非常流行的數據結構,它在各種應用場景中得到了廣泛的應用和發展。本文將從多個方面介紹Python方陣的優點、用法和實現方法,供讀者參考。 一、Python方陣的…

    編程 2025-04-27
  • MySQL 數據結構的詳細闡述

    一、存儲引擎 MySQL 數據庫使用不同的存儲引擎來支持不同的需求,如性能、事務支持、並發性等。目前,MySQL 支持的存儲引擎有 MyISAM、InnoDB、Memory、CSV…

    編程 2025-04-23
  • MySQL底層數據結構詳解

    一、B+樹索引 1、B+樹是一種平衡樹,它是一種多路查找樹,每個節點可以存儲多個索引值和相應數據的地址。MySQL使用B+樹作為索引結構,B+樹的優勢在於磁盤I/O瓶頸的優化,它的…

    編程 2025-04-18
  • redismset:實現高效可靠的分布式Set數據結構

    一、基本介紹 redismset是Redis數據庫中的一種高效可靠的分布式Set數據結構。它支持添加、刪除、查找等基本操作,並且可以在分布式的環境下正常工作。紅黑樹是redisms…

    編程 2025-02-11
  • 數據結構:從多個方面詳細闡述

    一、數據結構的概念 數據結構是計算機科學中一種重要的基礎概念,它是指數據對象及其之間的關係,是計算機存儲、組織數據的方式。數據結構既包含數據對象的物理結構,也包括它們之間的邏輯聯繫…

    編程 2025-02-05
  • 深入理解 JavaScript 的 Map 數據結構

    一、Map 數據結構是什麼? 在 ES6 之前,JavaScript 中內置的 key-value 序列結構只有 Object 或 Array。ES6 引入了新的數據結構 Map,…

    編程 2025-02-01
  • 算法與數據結構c語言描下載,數據結構與算法分析C++語言描述第三版

    本文目錄一覽: 1、《數據結構(C語言版)》pdf下載在線閱讀全文,求百度網盤雲資源 2、《數據結構與算法分析c語言描述第二版》pdf下載在線閱讀全文,求百度網盤雲資源 3、算法與…

    編程 2025-01-16
  • Shell二維數組實現數據結構

    一、什麼是二維數組 在計算機科學中,二維數組是一個數據結構,它是由一些列相同類型的元素組成的,每個元素由一組唯一的引用值(稱為索引或下標)標識。當需要存儲一些數值、文本或引用變量時…

    編程 2025-01-16

發表回復

登錄後才能評論