LeetCode每日精進:20.有效的括號

題目鏈接:20.有效的括號

題目描述:

????????給定一個只包括?'('')''{''}''['']'?的字符串?s?,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。
  3. 每個右括號都有一個對應的相同類型的左括號。

示例 1:

輸入:s = "()"

輸出:true

示例 2:

輸入:s = "()[]{}"

輸出:true

示例 3:

輸入:s = "(]"

輸出:false

示例 4:

輸入:s = "([])"

輸出:true

提示:

  • 1 <= s.length <= 104
  • s?僅由括號?'()[]{}'?組成

思路:借助數據結構棧,左括號入棧,右括號匹配?

? ? ? ? 由于棧的先進后出的特性,可以借助棧來實現對應括號的消除,匹配。

? ? ? ? 使用棧之前需要添加實現棧的相關代碼:參考棧:數據結構中的“時間管理大師”? ? ? ??

    char* ps = s;Stack st;StackInit(&st);

? ? ? ? 定義指針ps指向給定字符串,用來遍歷括號,創建棧st并初始化。

????????以示例2為例:

????????若當前遍歷到左括號:? ? ? ?

        if (*ps == '(' || *ps == '[' || *ps == '{'){StackPush(&st,*ps);}

·? ? ? ? 直接讓左括號入棧。?

? ? ? ? ?若當前遍歷到右括號,需要考慮兩種情況:

            if (StackEmpty(&st)){StackDestroy(&st);return false;}

? ? ? ? 若當前棧為空,s為圖示字符串,那么直接銷毀棧,返回false。

int top = StackTop(&st);
if ((*ps == ')' && top != '(') || (*ps == ']' && top != '[') || (*ps == '}' && top != '{'))
{StackDestroy(&st);return false;
}
StackPop(&st);

? ? ? ? 若當前棧不為空取棧頂元素與右括號進行匹配:

????????????????若合法,將棧頂元素出棧,進行下一組括號的匹配。

????????????????若不合法,銷毀棧并返回false。? ? ? ?

? ? ? ? 若s為圖中所示字符串,在匹配完合法括號后還有左括號入棧,那么就會導致跳出循環后棧不為空,所以需要對循環后的棧進行判空,這里使用三目操作符

    bool ret = StackEmpty(&st) ? true : false;StackDestroy(&st);return ret;

? ? ? ? 若當前棧為空返回true若當前棧不為空,說明棧中還有左括號,返回false,保存返回值后銷毀鏈表,返回ret即可。?

完整代碼:

typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top;		// 棧頂int _capacity;  // 容量 
}Stack;// 初始化棧 
void StackInit(Stack* ps)
{ps->_a = NULL;ps->_top = ps->_capacity = 0;
}// 入棧 
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->_top == ps->_capacity){int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc");exit(1);}ps->_a = tmp;ps->_capacity = newcapacity;}ps->_a[ps->_top++] = data;
}// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0 
int StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0;
}// 出棧 
void StackPop(Stack* ps) 
{assert(!StackEmpty(ps));--ps->_top;
}// 獲取棧頂元素 
STDataType StackTop(Stack* ps)
{assert(!StackEmpty(ps));return ps->_a[ps->_top - 1];
}// 獲取棧中有效元素個數 
int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}// 銷毀棧 
void StackDestroy(Stack* ps)
{if (ps->_a)ps->_a = NULL;ps->_top = ps->_capacity = 0;
}bool isValid(char* s) {char* ps = s;Stack st;StackInit(&st);while(*ps != '\0'){if (*ps == '(' || *ps == '[' || *ps == '{'){StackPush(&st,*ps);}else{if (StackEmpty(&st)){StackDestroy(&st);return false;}int top = StackTop(&st);if ((*ps == ')' && top != '(') || (*ps == ']' && top != '[') || (*ps == '}' && top != '{')){StackDestroy(&st);return false;}StackPop(&st);}ps++;}bool ret = StackEmpty(&st) ? true : false;StackDestroy(&st);return ret;
}

?

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

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

相關文章

llama.cpp部署 DeepSeek-R1 模型

一、llama.cpp 介紹 使用純 C/C推理 Meta 的LLaMA模型&#xff08;及其他模型&#xff09;。主要目標llama.cpp是在各種硬件&#xff08;本地和云端&#xff09;上以最少的設置和最先進的性能實現 LLM 推理。純 C/C 實現&#xff0c;無任何依賴項Apple 芯片是一流的——通過 A…

Web后端 - Maven管理工具

一 Maven簡單介紹 Maven是apache旗下的一個開源項目&#xff0c;是一款用于管理和構建java項目的工具。 Maven的作用 二 Maven 安裝配置 依賴配置 依賴傳遞 依賴范圍 生命周期 注意事項&#xff1a;在同一套生命周期中&#xff0c;當運行后面的階段時&#xff0c;前面的階段都…

[LeetCode力扣hot100]-C++常用數據結構

0.Vector 1.Set-常用滑動窗口 set<char> ans;//根據類型定義&#xff0c;像vector ans.count()//檢查某個元素是否在set里&#xff0c;1在0不在 ans.insert();//插入元素 ans.erase()//刪除某個指定元素 2.棧 3.樹 樹是一種特殊的數據結構&#xff0c;力扣二叉樹相…

vite+vue3開發uni-app時低版本瀏覽器不支持es6語法的問題排坑筆記

重要提示&#xff1a;請首先完整閱讀完文章內容后再操作&#xff0c;以免不必要的時間浪費&#xff01;切記&#xff01;&#xff01;&#xff01;在使用vitevue3開發uni-app項目時&#xff0c;存在低版本瀏覽器不兼容es6語法的問題&#xff0c;如“?.” “??” 等。為了方便…

《計算機視覺》——角點檢測和特征提取sift

角點檢測 角點的定義&#xff1a; 從直觀上理解&#xff0c;角點是圖像中兩條或多條邊緣的交點&#xff0c;在圖像中表現為局部區域內的灰度變化較為劇烈的點。在數學和計算機視覺中&#xff0c;角點可以被定義為在兩個或多個方向上具有顯著變化的點。比如在一幅建筑物的圖像…

WWW 2025 | 中南、微軟提出端到端雙重動態推薦模型,釋放LLM在序列推薦中的潛力...

©PaperWeekly 原創 作者 | 殷珺 單位 | 中南大學碩士研究生 研究方向 | 大語言模型、推薦系統 論文題目&#xff1a; Unleash LLMs Potential for Sequential Recommendation by Coordinating Dual Dynamic Index Mechanism 論文鏈接&#xff1a; https://openreview.net…

c# 2025/2/17 周一

16. 《表達式&#xff0c;語句詳解4》 20 未完。。 表達式&#xff0c;語句詳解_4_嗶哩嗶哩_bilibili

數據結構與算法面試專題——堆排序

完全二叉樹 完全二叉樹中如果每棵子樹的最大值都在頂部就是大根堆 完全二叉樹中如果每棵子樹的最小值都在頂部就是小根堆 設計目標&#xff1a;完全二叉樹的設計目標是高效地利用存儲空間&#xff0c;同時便于進行層次遍歷和數組存儲。它的結構使得每個節點的子節點都可以通過簡…

iOS開發書籍推薦 - 《高性能 iOS應用開發》(附帶鏈接)

引言 在 iOS 開發的過程中&#xff0c;隨著應用功能的增加和用戶需求的提升&#xff0c;性能優化成為了不可忽視的一環。尤其是面對復雜的界面、龐大的數據處理以及不斷增加的后臺操作&#xff0c;如何確保應用的流暢性和響應速度&#xff0c;成為開發者的一大挑戰。《高性能 …

微信小程序的制作

制作微信小程序的過程大致可以分為幾個步驟&#xff1a;從環境搭建、項目創建&#xff0c;到開發、調試和發布。下面我會為你簡要介紹每個步驟。 1. 準備工作 在開始開發微信小程序之前&#xff0c;你需要確保你已經完成了以下幾個步驟&#xff1a; 注冊微信小程序賬號&…

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能體系中&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 庫占據著重要的地位。作為一個與動態數據交換&#xff08;DDE&#xff09;緊密相關的庫文件&#xff0c;它為 LabVIEW 用戶提供了與其他…

gitte遠程倉庫修改后,本地沒有更新,本地與遠程倉庫不一致

問題 &#xff1a;gitte遠程倉庫修改后&#xff0c;本地沒有更新&#xff0c;本地與遠程倉庫不一致 現象&#xff1a; [cxqiZwz9fjj2ssnshikw14avaZ rpc]$ git push Username for https://gitee.com: beihangya Password for https://beihangyagitee.com: To https://gitee.c…

組合模式詳解(Java)

一、組合模式基本概念 1.1 定義與類型 組合模式是一種結構型設計模式,它通過將對象組織成樹形結構,來表示“部分-整體”的層次關系。這種模式使得客戶端可以一致地對待單個對象和組合對象,從而簡化了客戶端代碼的復雜性。組合模式的核心在于定義了一個抽象組件角色,這個角…

LabVIEW危化品倉庫的安全監測系統

本案例展示了基于LabVIEW平臺設計的危化品倉庫安全監測系統&#xff0c;結合ZigBee無線通信技術、485串口通訊技術和傳感器技術&#xff0c;實現了對危化品倉庫的實時無線監測。該系統不僅能提高安全性&#xff0c;還能大幅提升工作效率&#xff0c;確保危化品倉庫的安全運營。…

【私人筆記】Web前端

Vue專題 vue3 vue3 頁面路徑前面添加目錄 - 路由base設置 - vite設置base https://mbd.baidu.com/ma/s/XdDrePju 修改vite.config.js export default defineConfig({base: /your-directory/,// 其他配置... }); vue2 uniapp 【持續更新】uni-app學習筆記_uniapp快速復制一…

數倉搭建:DWB層(基礎數據層)

維度退化: 通過減少表的數量和提高數據的冗余來優化查詢性能。 在維度退化中&#xff0c;相關的維度數據被合并到一個寬表中&#xff0c;減少了查詢時需要進行的表連接操作。例如&#xff0c;在銷售數據倉庫中&#xff0c;客戶信息、產品信息和時間信息等維度可能會被合并到一…

【Linux】進程間通信——進程池

文章目錄 進程池什么進程池進程池的作用 用代碼模擬進程池管道信息任務類InitProcesspool()DisPatchTasks()任務的執行邏輯&#xff08;Work&#xff09;CleanProcessPool() 封裝main.ccChannel.hppProcessPool.hppTask.hppMakefile 總結總結 進程池 什么進程池 進程池&#…

13-跳躍游戲 II

給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。 每個元素 nums[i] 表示從索引 i 向后跳轉的最大長度。換句話說&#xff0c;如果你在 nums[i] 處&#xff0c;你可以跳轉到任意 nums[i j] 處: 0 < j < nums[i] i j < n 返回到達 nums[n - 1] 的最…

Qt的QToolBox的使用

QToolBox 是 Qt 框架中的一個控件&#xff0c;用于創建一個可折疊的“工具箱”界面&#xff08;類似 Windows 資源管理器的側邊欄&#xff09;。每個子項可以展開或折疊&#xff0c;適合用于分組顯示多個功能模塊。以下是其基本用法和示例&#xff1a; 1. 基本用法 創建并添加…

《DeepSeek 一站式工作生活 AI 助手》

最近國產AI工具DeepSeek在全球火出圈&#xff0c;登頂多個國家應用商店&#xff0c;下載量一路飆升。這匹AI “黑馬” 到底憑什么征服全球用戶&#xff1f;讓我們全方位解鎖DeepSeek——從基礎入門到高階玩法&#xff0c;從實用技巧到隱藏功能。 DeepSeek是一款功能強大的國產A…