03-3.3.1 棧在括號匹配中的應用

  • 👋 Hi, I’m @Beast Cheng
  • 👀 I’m interested in photography, hiking, landscape…
  • 🌱 I’m currently learning python, javascript, kotlin…
  • 📫 How to reach me --> 458290771@qq.com

喜歡《數據結構》部分筆記的小伙伴可以訂閱專欄,今后還會不斷更新。🧑?💻
此外,《程序員必備技能》專欄和《程序員必備工具》專欄(該專欄暫未開設)日后會逐步更新,感興趣的小伙伴可以點一下訂閱、收藏、關注!🚀
謝謝大家!🙏

括號示例

void test(){int a[10][10];int x = 10*(20*(1+1)-(3-2));printf("加油!奧里給!");
}

流程應該為:

  • 遇到左括號就入棧
  • 遇到右括號,就“消耗”一個左括號
  • 處理完所有括號后,棧非空——左括號單身
  • 因此寫代碼的時候,掃描完所有的括號后,還要檢查是否棧空
  • 如果棧非空,則匹配失敗

算法實現

#define MaxSize 10
typedef struct{char data[MaxSize];int top;
}SqStack;/*
* 考試中可以直接使用棧的這些基本操作
* 但是建議要寫上簡短的說明接口分別是什么
*///初始化棧
void InitStack(SqStack &S)
//判斷棧是否為空
bool StackEmpty(SqStack S)
//新元素入棧
bool Push(SqStack &S, char x)
//棧頂元素出棧,用x返回
bool Pop(SqStack &S, char &x)bool bracketCheck(char str[], int length){SqStack S;                  //聲明一個棧InitStack(S);               //初始化一個棧for(int i=0; i>length; i++){if(str[i] == '(' || str[i] == ')' || str[i] == '{'){Push(S, str[i]);    //掃描到左括號,入棧}else{if(StackEmpty(S))   //掃描到右括號,且當前棧空return false;   //匹配失敗char topElem;Pop(S, topElem);    //棧頂元素出棧if(str[i] == ')' && topElem != '(')return false;if(str[i] == ']' && topElem != '[')return false;if(str[i] == '}' && topElem != '{')return false;}}return StackEmpty(S);   //檢索完所有括號后,棧空說明匹配成功
}

需要注意的是,當前定義的最大長度是10,如果長度不夠了怎么辦?
答:可以用鏈棧的方式來實現,不過在考試中用順序棧來實現更方便,所以用順序棧就可以了


練習:去掉代碼中的基本操作,把相對應的邏輯換成對數組top指針直接的判斷和操作,動手實現完整代碼!
答案

  • 先將基本操作替換一下
//首先,初始化棧
//將棧的top指針初始化為 -1,表示棧為空
S.top = -1;//判斷棧是否為空
//也就是判斷top是否為 -1,如果是,表示棧空
if(S.top == -1)//新元素入棧,將元素放在top指針所指位置的下一位,并將top指針 +1
if(S.top < MaxSize - 1){S.data[++S.top] = str[i];
}else{return false;
}//棧頂元素出棧,獲取top指針所指位置的元素,并將top指針 -1
if(S.top != -1){topElem = S.data[S.top--];
}else{return false;
}
  • 最終完整代碼
#include <stdbool.h>
#include <stdio.h>#define MaxSize 10typedef struct{char data[MaxSize];int top;
}SqStack;bool bracketCheck(char str[], int length){SqStack S;    //聲明一個棧S.top = -1;   //初始化棧for(int i = 0; i < length; i++){if(str[i] == '(' || str[i] == '[' || str[i] == '{'){if(S.top < MaxSize - 1){S.data[++S.top] = str[i];  //掃描到左括號,入棧}else{return false;  //棧滿,匹配失敗}}else if(str[i] == ')' || str[i] == ']' || str[i] == '}'){if(S.top == -1)    //掃描到右括號,且當前棧空return false;  //匹配失敗char topElem;if(S.top != -1){topElem = S.data[S.top--];  //棧頂元素出棧}else{return false;  //棧空,匹配失敗}if((str[i] == ')' && topElem != '(') ||(str[i] == ']' && topElem != '[') ||(str[i] == '}' && topElem != '{'))return false;  //匹配失敗}}return S.top == -1;  //檢索完所有括號后,棧空說明匹配成功
}int main(){char str[] = "{[()]}";int length = sizeof(str) / sizeof(str[0]) - 1;bool result = bracketCheck(str, length);if(result)printf("括號都是成對的\n");elseprintf("括號不是成對的\n");return 0;
}

以上代碼的問題解答

  1. 為什么用S.top == MaxSize - 1這個條件來判斷是否棧滿?為什么MaxSize要-1 ?
    • 在使用數組實現棧的情況下,我們需要知道數組的最大容量。假設數組的最大長度為 MaxSize,那么數組的索引范圍是從 0MaxSize - 1。也就是說,數組中最后一個位置的索引是 MaxSize - 1
    • S.top:棧頂指針,指向當前棧頂元素的位置;MaxSize - 1:數組的最大索引。
    • 如果 S.top 正好等于 MaxSize - 1,說明棧頂已經在數組的最后一個位置,因此棧中已經沒有空余的空間可以容納更多的元素,棧已經滿了。
  2. S.data[++S.top] = str[i]; // 入棧時,是先將指針+1,還是先壓入數據?
    • 在這條語句中,++S.top 是一個前置自增操作。這意味著:
      • S.top先增加 1,然后新值會被用作索引來存放新元素 str[i]
      • 也就是說,S.top會先增加一,然后指向下一個位置,然后在指向的這個位置里面插入元素str[i]
  3. str[i]是什么意思?其中的i又是什么意思?
    • str:是一個字符數組(字符串),它包含了需要被檢查的括號字符。
    • i:是一個整數,作為循環變量,表示當前在數組 str 中的索引。循環遍歷 str 數組中的每一個字符,通過 str[i] 來訪問 str 數組在第 i 個位置的字符
  4. 在這個for循環中,只要有任意一次匹配失敗,就會中斷循環,并且返回false

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

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

相關文章

echarts的使用

一 echarts的使用 引入 echarts.js 文件 <script src"https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> 準備一個呈現圖表的盒子 <div class"container"><div class"t_header"><span>端午…

東方博宜1760 - 整理抽屜

題目描述 期末考試即將來臨&#xff0c;小T由于同時肩負了學習、競賽、班團活動等多方面的任務&#xff0c;一直沒有時間好好整理他的課桌抽屜&#xff0c;為了更好地復習&#xff0c;小T首先要把課桌抽屜里的書分類整理好。 小T的抽屜里堆著 N 本書&#xff0c;每本書的封面上…

智能視頻監控平臺LntonCVS視頻融合共享平臺保障露營安全解決方案

在當今社會&#xff0c;都市生活的快節奏和壓力使得越來越多的人渴望逃離城市的喧囂&#xff0c;尋求一種短暫的慢生活體驗。他們向往在壯麗的山河之間或寧靜的鄉村中露營&#xff0c;享受大自然的寧靜與美好。隨著露營活動的普及&#xff0c;露營地的場景也變得更加豐富多樣&a…

使用python繪制核密度估計圖

使用python繪制核密度估計圖 核密度估計圖介紹效果代碼 核密度估計圖介紹 核密度估計&#xff08;Kernel Density Estimation&#xff0c;KDE&#xff09;是一種用于估計數據概率密度函數的非參數方法。與直方圖不同&#xff0c;KDE 可以生成平滑的密度曲線&#xff0c;更好地…

Mybatis使用緩存的配置總結

1.全局變量配置cacheEnabled&#xff1a; ture&#xff08;默認&#xff09;&#xff1a;開啟二級緩存&#xff0c; false&#xff1a;關閉二級緩存&#xff0c;但一級緩存不受影響 2.映射文件中mapper標簽下&#xff1a; 配置有&#xff1a;開啟二級緩存 沒配置有&#x…

LeetCode62不同路徑

題目描述 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。問總共有多少條不同的路徑&#xff1f; …

大模型參加高考,同寫2024年高考作文,及格分(通義千問、Kimi、智譜清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

大家好&#xff0c;我是章北海 今天高考&#xff0c;上午的語文結束&#xff0c;市面上又要來一場大模型參考的文章了。 我也湊湊熱鬧&#xff0c;讓通義千問、Kimi、智譜清言一起來寫一下高考作文。 公平起見&#xff0c;不加任何其他prompt&#xff0c;直接把題目甩過去。…

網絡基礎_02

1.ARP協議 地址解析協議&#xff08;Address Resolution Protocol&#xff09; 已知對方的三層ip地址&#xff0c;需要二層mac地址 當一臺設備&#xff08;請求方&#xff09;需要知道某個 IP 地址對應的 MAC 地址時&#xff0c;會使用 ARP封裝一個數據幀。這臺設備的網絡層以…

華為RH2288H V3服務器iBMC的SSL證書續期

本文對華為RH2288H V3服務器iBMC的SSL證書續期&#xff0c;以避名登錄告警提示及主機狀態異常。 一、檢查現網服務器iBMC的SSL證書到期時間 登錄iBMC&#xff0c;點擊配置--SSL證書&#xff0c;如下&#xff1a; 可以看到本服務器SSL證書將于今年7月22日到期。 二、聯系廠家…

【第四節】C/C++數據結構之樹與二叉樹

目錄 一、基本概念與術語 二、樹的ADT 三、二叉樹的定義和術語 四、平衡二叉樹 4.1 解釋 4.2 相關經典操作 4.3 代碼展示 一、基本概念與術語 樹(Tree)是由一個或多個結點組成的有限集合T。其中: 1 有一個特定的結點&#xff0c;稱為該樹的根(root)結點&#xff1b; 2 …

【Linux】進程2——管理概念,進程概念

1.什么是管理&#xff1f; 那在還沒有學習進程之前&#xff0c;就問大家&#xff0c;操作系統是怎么管理進行進程管理的呢&#xff1f; 很簡單&#xff0c;先把進程描述起來&#xff0c;再把進程組織起來&#xff01; 我們拿大學為例子 最典型的管理者——校長最典型的被管理…

來自工業界的知識庫 RAG 服務(三),FinGLM 競賽獲獎項目詳解

背景介紹 前面介紹過工業界的 RAG 服務 QAnything 和 RagFlow 的詳細設計&#xff0c;也介紹過來自學術界的 一些優化手段。 前一陣子剛好看到智譜組織的一個金融大模型比賽 FinGLM&#xff0c;主要做就是 RAG 服務的競賽&#xff0c;深入研究了其中的幾個獲獎作品&#xff…

Pyramid Vision Transformer, PVT(ICCV 2021)原理與代碼解讀

paper&#xff1a;Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions official implementation&#xff1a;GitHub - whai362/PVT: Official implementation of PVT series 存在的問題 現有的 Vision Transformer (ViT) 主要設計…

C++結合ffmpeg獲取聲音的分貝值

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、分貝是什么&#xff1f;1.功率量2.場量 二、實際操作1.分析wav文件2.讀取麥克風 總結 前言 最近面對一個需求&#xff0c;就是需要傳遞聲音文件到模型里推…

鏈表的回文結構OJ

鏈表的回文結構_牛客題霸_牛客網對于一個鏈表&#xff0c;請設計一個時間復雜度為O(n),額外空間復雜度為O(1)的算法&#xff0c;判斷其是否為。題目來自【牛客題霸】https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&a…

CodeMeter助力Hilscher,推動實現全球智能制造連接解決方案

Hilscher的旗艦店為開放工業4.0聯盟&#xff08;OI4&#xff09;社區提供了應用商店的便捷和開放性&#xff0c;將這一概念引入工業領域。該商店依托CodeMeter的許可證管理和加密保護&#xff0c;為工業用戶提供了豐富的應用和解決方案庫&#xff0c;滿足他們在車間自動化和連接…

2020年06月C語言二級真題

計算矩陣邊緣元素之和 題目描述 輸入一個整數矩陣&#xff0c;計算位于矩陣邊緣的元素之和。 所謂矩陣邊緣的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 輸入格式 第一行分別為矩陣的行數n和列數m&#xff0c;兩者之間以一個空格分開。 接下來輸…

WPF中讀取Excel文件的內容

演示效果 實現方案 1.首先導入需要的Dll(這部分可能需要你自己搜一下) Epplus.dll Excel.dll ICSharpCode.SharpZipLib.dll 2.在你的解決方案的的依賴項->添加引用->瀏覽->選擇1中的這幾個Dll點擊確定。(添加依賴) 3.然后看代碼內容 附上源碼 using Excel; usi…

計網復習資料

一、選擇題&#xff08;每題2分&#xff0c;共40分&#xff09; 1. Internet 網絡本質上屬于&#xff08; &#xff09;網絡。 A.電路交換 B.報文交換 C.分組交換 D.虛電路 2.在 OSI 參考模型中,自下而上第一個提供端到端服務的是( )。 A.數據鏈路層 B.傳輸…

Thinkphp使用Elasticsearch查詢

在Thinkphp中調用ES&#xff0c;如果自己手寫json格式的query肯定是很麻煩的。我這里使用的是ONGR ElasticsearchDSL 構建 ES 查詢。ongr ElasticsearchDSL 的開源項目地址&#xff1a;GitHub - ongr-io/ElasticsearchDSL: Query DSL library for Elasticsearch。ONGR Elastics…