從括號匹配看棧:數據結構入門的實戰與原理

在計算機科學的世界里,數據結構是程序員的 “瑞士軍刀”,不同的數據結構適用于不同的場景,能高效解決各類問題。其中,棧作為一種簡單卻強大的數據結構,在很多實際應用中發揮著關鍵作用。今天,我們就通過一個經典的問題 —— 括號匹配,來深入理解棧的原理與應用。?

一、認識棧:后進先出的 “數據倉庫”?

棧(Stack)是一種遵循后進先出(Last In First Out,LIFO)原則的數據結構。就像一疊盤子,我們只能從最上面取盤子,也只能把新盤子放到最上面。在棧中,新元素的添加(進棧,Push)和已有元素的移除(出棧,Pop)都只能在一端進行,這一端被稱為棧頂(Top)。

二、棧的基本操作:搭建數據處理的 “腳手架”?

#include <stdio.h>
#define MaxSize 100
typedef char ElemType;// 定義棧結構體
typedef struct stack {ElemType elem[MaxSize];  // 存儲棧元素的數組int top;                 // 棧頂指針
} *Sqstacktp, Sqstack;// 初始化棧
void InitSqstack(Sqstacktp s) {s->top = 0;  // 棧頂指針初始化為 0,表示棧為空
}// 進棧操作
void Push(Sqstacktp s, ElemType x) {if (s->top == MaxSize) {  // 判斷棧是否已滿printf("Overflow\n");  // 棧滿則輸出溢出信息} else {s->elem[s->top] = x;  // 將元素 x 放入棧頂位置s->top++;             // 棧頂指針加 1}
}// 出棧操作
ElemType Pop(Sqstacktp s) {if (s->top == 0) {  // 判斷棧是否為空return '\0';    // 棧空則返回空字符} else {s->top--;              // 棧頂指針減 1return s->elem[s->top];// 返回棧頂元素}
}// 讀棧頂元素
ElemType GetSqstacktop(Sqstacktp s) {if (s->top == 0) {  // 判斷棧是否為空return '\0';    // 棧空則返回空字符} else {return s->elem[s->top - 1];  // 返回棧頂元素}
}// 判斷括號是否匹配函數
void match() {Sqstack s;char ch;int flag = 1;  // 用于標記括號是否匹配,初始化為 1 表示匹配InitSqstack(&s);  // 初始化棧printf("請輸入一個帶括號的算術表達式: ");while ((ch = getchar()) != '\n') {  // 逐個讀取輸入的字符,直到換行符if (ch == ')' || ch == ']' || ch == '}') {  // 遇到右括號if (GetSqstacktop(&s) == '(' && ch == ')') {  // 判斷棧頂左括號是否匹配Pop(&s);  // 匹配則出棧} else if (GetSqstacktop(&s) == '[' && ch == ']') {Pop(&s);} else if (GetSqstacktop(&s) == '{' && ch == '}') {Pop(&s);} else {flag = 0;  // 不匹配則標記為不匹配}}if (ch == '(' || ch == '[' || ch == '{') {  // 遇到左括號Push(&s, ch);  // 左括號進棧}}if (s.top == 0 && flag) {  // 棧為空且標記為匹配printf("表達式括號匹配\n");} else {printf("表達式括號不匹配\n");}
}int main() {match();return 0;
}

三、括號匹配:棧的經典應用場景?

括號匹配問題是棧的典型應用之一。在編程語言中,括號必須正確配對,否則代碼會出現語法錯誤。例如,{}、[]、() 必須成對出現,并且嵌套順序要正確。利用棧的后進先出特性,我們可以輕松解決這個問題。

在 match 函數中,我們首先初始化一個棧和一個標記變量 flag。然后,逐個讀取輸入的字符:?

  • 當遇到左括號時,將其壓入棧中;?
  • 當遇到右括號時,檢查棧頂元素是否為對應的左括號。如果是,則將棧頂元素彈出,表示這對括號匹配成功;如果不是,則說明括號不匹配,將 flag 設為 0。?
  • 當所有字符都處理完后,若棧為空且 flag 為 1,則說明所有括號都匹配;否則,括號不匹配。?

四、棧的優勢與應用拓展?

通過括號匹配問題,我們可以清晰地看到棧的優勢:?

  • 邏輯簡單:后進先出的特性使得棧的操作邏輯直觀易懂,易于實現和維護。?
  • 高效處理:對于具有 “嵌套” 或 “逆序” 特性的問題,棧能夠快速處理,時間復雜度通常為 ?

    O(n),其中 ?n是輸入數據的規模。?

棧在實際編程中還有很多應用場景:?

  • 函數調用棧:在程序運行時,函數的調用和返回依賴棧來管理局部變量、參數和返回地址。?
  • 表達式求值:無論是中綴表達式還是后綴表達式的計算,棧都發揮著重要作用。?
  • 瀏覽器歷史記錄:瀏覽器的 “前進” 和 “后退” 功能,本質上就是利用棧來記錄和管理訪問過的頁面。?

五、總結:小數據結構,大能量?

從括號匹配的實戰中,我們深入了解了棧這種數據結構的原理、基本操作及其強大的應用能力。棧雖然簡單,但在解決實際問題時卻能發揮巨大的作用。作為數據結構入門的重要內容,掌握棧的相關知識不僅能幫助我們更好地理解計算機底層的運行機制,還能為后續學習更復雜的數據結構(如隊列、樹、圖)打下堅實的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79385.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dubbo(89)如何設計一個支持多語言的Dubbo服務?

設計一個支持多語言的Dubbo服務需要考慮以下幾個方面&#xff1a; 服務接口設計&#xff1a;確保服務接口的定義可以被不同語言實現。序列化協議&#xff1a;選擇一個支持多語言的序列化協議&#xff0c;例如Protobuf、Thrift、gRPC等。服務注冊與發現&#xff1a;確保服務注冊…

力扣面試150題--分隔鏈表

day 39 題目描述 思路 遍歷鏈表&#xff0c;每一個點與值比較&#xff0c;比值小就繼續&#xff0c;比值大就放到鏈表尾部即可 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int…

VSCode 查看文件的本地修改歷史

1. 使用時間線視圖&#xff08;Timeline&#xff09; 新版 VSCode 內置了一個叫 Timeline&#xff08;時間線&#xff09; 的功能&#xff0c;可以查看&#xff1a; 本地文件修改記錄&#xff08;包括保存歷史&#xff09;Git 提交歷史&#xff08;如果倉庫是 Git 管理的&…

C++學習-入門到精通-【3】控制語句、賦值、自增和自減運算符

C學習-入門到精通-【3】控制語句、賦值、自增和自減運算符 控制語句、賦值、自增和自減運算符 C學習-入門到精通-【3】控制語句、賦值、自增和自減運算符一、什么是算法二、偽代碼三、控制結構順序結構選擇結構if語句if...else語句switch語句 循環結構while語句 四、算法詳述&a…

父子組件雙向綁定

v-model 語法糖實現 vue中我們在input中可以直接使用v-model來完成雙向綁定,這個時候 v-model 通常會幫我們完成兩件事: v-bind:value的數據綁定@input的事件監聽如果我們現在封裝了一個組件,其他地方在使用這個組件時,是否也可以使用v-model來同時完成這兩個功能呢? 當我…

用Selenium開啟自動化網頁交互與數據抓取之旅

用Selenium開啟自動化網頁交互與數據抓取之旅 在當今數字化時代&#xff0c;數據的價值不言而喻&#xff0c;而網頁作為海量數據的重要載體&#xff0c;如何高效獲取其中的關鍵信息成為眾多開發者和數據愛好者關注的焦點。Selenium這一強大工具&#xff0c;為我們打開了自動化…

VB.net序列化和反序列化的使用方法和實用場景

引言 相信很多初學編程的人都會提出過這個疑問&#xff1a;“既然我的變量可以存在內存之中&#xff0c;那么是否也可以存在硬盤之中呢” 其實我想回答的是&#xff0c;完全可以而且方法不止一種&#xff0c;而今天講的是序列化最經典的——二進制序列化 由于序列化的部分已…

Android OTA

一、OTA運行原理 Android 平臺提供 Google diff arithmetic 差分機制&#xff0c;升級包支持完整升級以及差分升級&#xff0c;OTA 運行原理圖如下所示。 1. OTA Server 負責對更新包進行上傳&#xff0c;下載以及版本的管理。 2. 開發者在修改 Android 系統后&#xff0c;通…

Untiy基礎學習(三)Untiy中編寫腳本的基本規則

一、怎么創建腳本 在Project窗口下&#xff0c;右鍵Create C#Script 即可創建腳本 創建腳本的注意事項 &#xff1a; 1&#xff09;類名和文件名必須一致,不然不能掛載&#xff08;因為反射機制創建對象&#xff0c;會通過文件名去找Type&#xff09; 2&#xff09;沒有特殊需…

VBA宏即根據第一列的內容和第二列的數字,按照數字數量生成對應內容并依次放在第三列、第四列等

打開你的 Excel 工作表。按下 Alt F11 組合鍵&#xff0c;打開 VBA 編輯器。在 VBA 編輯器中&#xff0c;點擊 插入 -> 模塊。在模塊窗口中&#xff0c;輸入以下 VBA 代碼&#xff1a; Sub GenerateItems()Dim lastRow As LongDim i As Long, j As LongDim item As String…

深度學習系統學習系列【1】之基本知識

文章目錄 說明基礎知識人工智能、機器學習、深度學習的關系機器學習傳統機器學習的缺陷選擇深度學習的原因深度學習的關鍵問題深度學習的應用深度學習的加速硬件GPU環境搭建主流深度學習框架對比 說明 文章屬于個人學習筆記內容&#xff0c;僅供學習和交流。內容參考深度學習原…

論文筆記-基于多層感知器(MLP)的多變量橋式起重機自適應安全制動與距離預測

《IET Cyber-Systems and Robotics》出版山東大學 Tenglong Zhang 和 Guoliang Liu 團隊的研究成果&#xff0c;文章題為“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 橋式起重機的緊急制動及其制動距離預測是…

DeepSeek實戰--各版本對比

1.對比 版本參數量優勢劣勢使用場景競品DeepSeek-V36710億&#xff08;MoE架構&#xff0c;激活370億&#xff09;開源、高效推理&#xff08;60 TPS&#xff09;、低成本&#xff08;API費用低&#xff09;、中文處理能力突出&#xff08;90%準確率多模態能力有限通用任務&am…

從0開始建立Github個人博客(hugoPaperMod)

從0開始建立Github個人博客(hugo&PaperMod) github提供給每個用戶一個網址&#xff0c;用戶可以建立自己的靜態網站。 一、Hugo hugo是一個快速搭建網站的工具&#xff0c;由go語言編寫。 1.安裝hugo 到hugo的github標簽頁Tags gohugoio/hugo選擇一個版本&#xff0c…

【AI論文】WebThinker:賦予大型推理模型深度研究能力

摘要&#xff1a;大型推理模型&#xff08;LRMs&#xff09;&#xff0c;如OpenAI-o1和DeepSeek-R1&#xff0c;展示了令人印象深刻的長期推理能力。 然而&#xff0c;他們對靜態內部知識的依賴限制了他們在復雜的知識密集型任務上的表現&#xff0c;并阻礙了他們生成需要綜合各…

Linux_sudo命令的使用與機制

1、sudo命令的作用 sudo&#xff08;全稱 superuser do&#xff09;是 Linux/Unix 系統中權限管理的核心工具。 允許普通用戶在授權下以其他用戶&#xff08;默認是 root&#xff09;的權限執行命令&#xff0c;而無需直接登錄賬戶。 2、sudo命令的典型使用場景 sudo 覆蓋了系…

Scrapy框架之 中間件的使用

爬蟲中間件 特點&#xff1a;主要處理蜘蛛&#xff08;Spider&#xff09;和下載器&#xff08;Downloader&#xff09;之間的請求和響應。可以對蜘蛛生成的請求進行攔截、修改或過濾&#xff0c;也可以對下載器返回給蜘蛛的響應進行處理。適用場景&#xff1a; 請求過濾與修改…

供應鏈算法整理(一)--- 銷量預估

在供應鏈管理領域有較多的預估場景&#xff0c;例如送達時長預估、銷量預估、用電量預估。特別的在智能供應鏈領域&#xff0c;銷量和庫存的管理的智能化也依賴銷量預估&#xff0c;因此在本文我們整理了 銷量預估的算法詳細的技術方案。 時間序列預測在最近兩年內發生了巨大的…

第4篇:服務層抽象與復用邏輯

在業務系統復雜度指數級增長的今天&#xff0c;服務層&#xff08;Service Layer&#xff09;的合理設計直接影響著系統的可維護性和擴展性。本文將深入剖析 Egg.js 框架中的服務層架構設計&#xff0c;從基礎實現到高級封裝&#xff0c;全方位講解企業級應用的開發實踐。 一、…

Java學習手冊:Spring 數據訪問

一、Spring JDBC JdbcTemplate &#xff1a;Spring JDBC 提供了 JdbcTemplate 類&#xff0c;它簡化了數據庫操作&#xff0c;提供了豐富的 API 來執行數據庫訪問任務。JdbcTemplate 可以自動處理數據庫連接的獲取、釋放&#xff0c;SQL 語句的執行&#xff0c;結果集的處理等…