C語言/數據結構——每日一題(有效的括號)

一.前言

如果想要使用C語言來解決這道題——有效的括號:https://leetcode.cn/problems/valid-parentheses/description/我們必須要借用上一篇我們所講的內容——棧的實現:https://blog.csdn.net/yiqingaa/article/details/138923750?spm=1001.2014.3001.5502

因為在C語言環境下,力扣不會主動幫你實現棧,需要用戶自己手動創建棧。但是在C++環境下,力扣會主動為我們實現棧。

2.正文?

1.1題目描述

1.2題目分析

1.21 題目想讓用戶干什么

這道題為我們用戶提供了一個字符串s。我們需要編寫程序來判斷所給字符串s中,相同類型的左括號與右括號是否一 一匹配。如果匹配正確就返回true。匹配不正確就返回false。

?1.22 如何求解題目

這道題我們可以運用棧的知識面來求出這道題。

我們可以先創建一個棧變量st,然后讓字符串s逐一遍歷字符,如果遍歷過程中字符是‘(’? ? ‘[’? ?‘{’? ?都可以將它們尾插到我們棧當中。如果在遍歷過程中不是‘(’? ? ‘[’? ?‘{’ ,而是‘)’? ? ‘]’? ?‘}’我們可以調用之前寫好的函數功能——取出棧頂元素( STDataType STTop(ST* ps) 這里的SLDataType是我們棧數據類型,可能是int、char或者其他類型。),調出可能之前存入棧的字符‘(’? ? ‘[’? ?‘{’ ,并與遍歷字符作對比。這里我暫且將取出棧頂的元素用變量top接受。我們就有取出棧頂元素,與現在遍歷字符的關系:

if ((top == '(' && *s != ')') ||

? ? ? ? ? ? (top == '{' && *s != '}') ||

? ? ? ? ? ? (top == '[' && *s != ']'))

滿足上面其中一個條件我們就可以說明,相同類型的左括號與右括號沒有一 一匹配。我們直接返回false即可。

值得注意的是:在返回true,或者false之前,都要對棧進行銷毀處理——void STDestroy(ST* ps)

1.3代碼實現

typedef int STDataType;
struct Stack
{STDataType* a;int top;int capacity;
};
typedef struct Stack ST;
void STInit(ST* ps);//棧的初始化
void STDestroy(ST* ps);//棧的銷毀void STPush(ST*PS,STDataType x);//入棧
void STPop(ST* ps);//出棧STDataType STTop(ST* ps);//取棧頂的數據bool STEmpty(ST*ps);//判空int STSize(ST* PS);//獲取數據個數
void STInit(ST *ps)//棧的初始化
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}
void STDestroy(ST* ps)//棧的銷毀
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}
void STPush(ST* ps, STDataType x)//入棧
{assert(ps);if (ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 10 : ps->capacity*2;STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");return;}                ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}
void STPop(ST* ps)//刪除棧頂元素
{assert(ps);assert(ps->a);ps->top--;
}
STDataType STTop(ST* ps)//取出棧頂元素
{assert(ps);assert(ps->top >= 0);return ps->a[ps->top-1];
}
bool STEmpty(ST* ps)//判斷棧內元素是否為空
{assert(ps);if (ps->top == 0)return true;return false;
}
int STSize(ST* ps)//獲取數據個數
{assert(ps);return ps->top ;
}
bool isValid(char* s) 
{ST st;
STInit(&st);
while (*s)
{if (*s == '(' || *s == '{' || *s == '['){STPush(&st, *s);}else{if(STEmpty(&st))//這一步是必須的,因為如果棧為空且*s是')' ']' '}',說明
//題目給出的字符可能是這樣的“)”、“(){}]”。類似這種情況都是不符合題意的情況。return false;char top = STTop(&st);STPop(&st);//這里一定要進行尾部棧頂元素刪除,以便遍歷字符和棧內字符能夠對的上if ((top == '(' && *s != ')') ||(top == '{' && *s != '}') ||(top == '[' && *s != ']')){return false;}}++s;
}
if (st.top != 0)return false;
STDestroy(&st);
return true;
}

三.結言?

今天的題目分享就到此結束了,覺得對你有所幫助的同學,能不能求一個三連。

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

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

相關文章

go routing 之 gorilla/mux

1. 背景 繼續學習 go 2. 關于 routing 的學習 上一篇 go 用的庫是:net/http ,這次我們使用官方的庫 github.com/gorilla/mux 來實現 routing。 3. demo示例 package mainimport ("fmt""net/http""github.com/gorilla/mux&…

react實現把pc網站快捷添加到桌面快捷方式

文章目錄 1. 需求2. 實現效果3. 核心邏輯4. 完整react代碼 1. 需求 這種需求其實在國外一些游戲網站和推廣網站中經常會用到,目的是為了讓客戶 快捷方便的保存網站到桌面 ,網站主動盡量避免下次找不到網站地址了,當然精確的客戶自己也可以使…

Python 字符串中運算符號可運行

使用eval() re {\n "path": "/sms/sendMsg",\n "data": {\n "mobile": "12345678901",\n "signCode": "短信簽名",\n "templateCode": "SMS_yyyy…

Oracle遞歸查詢筆記

目錄 一、創建表結構和插入數據 二、查詢所有子節點 三、查詢所有父節點 四、查詢指定節點的根節點 五、查詢指定節點的遞歸路徑 六、遞歸子類 七、遞歸父類 一、創建表結構和插入數據 CREATE TABLE "REGION" ( "ID" VARCHAR2(36) DEFAULT SYS_GUI…

解析Oracle文件頭內容

保存在Oracle數據文件頭中的信息很豐富,通常只要查詢DATAFILE_HEADER視圖就可以獲得數據文件頭中的信息。但其在數據文件頭中的具體位置,Oracle一直未公開過。所幸的是DBA們對數據文件頭的研究孜孜不倦,其研究成果在網上也是隨處可見。雖然這…

[前端|vue] 驗證器validator使用筆記 (筆記)

文檔 validator.js文檔地址 規則編寫示例 element-plus 使用示例 const captchaLoginRules {phoneNumber: [{ required: true, message: 手機號不能為空, trigger: blur },{validator: (_rule: any, value: string, _callback: any): boolean > {return isMobilePhone(…

vue-quill-editor 富文本編輯器使用出現的樣式問題

使用富文本類型&#xff1a; vue-quill-editor 注意&#xff1a; 富文本導出 html 我們使用的時候&#xff0c; 樣式凸顯不出來 DOM 結構 <p><sub class"ql-size-large">測試內容</sub><sup class"ql-size-large">222222</su…

6步:用NGINX部署ASP.NET Core,輕松上云

1. 準備工作在開始部署之前&#xff0c;確保你已經完成了以下準備工作&#xff1a;- 安裝.NET Core&#xff1a;確保你的Linux系統上安裝了.NET Core運行時。你可以從.NET官網下載。- 安裝NGINX&#xff1a;通過你的Linux發行版的包管理器安裝NGINX。例如&#xff0c;在Ubuntu上…

GPT提示詞技巧,使用教程,國內版官網直達,非套殼

GPT提示詞技巧&#xff0c;使用教程&#xff0c;國內版官網直達&#xff0c;非套殼 主站點&#xff1a;https://chatgpt-plus.top&#xff08;江蘇福建地區打不開&#xff0c;需要魔法&#xff09; 店鋪地址&#xff1a;https://buy.chatgpt-plus.top/ 選擇plus賬號進入&…

鴻蒙開發ArkUI-X基礎知識:【ArkUI代碼工程及構建介紹】

代碼工程及構建介紹 背景 ArkUI作為OpenHarmony的默認開發框架&#xff0c;在本項目&#xff08;ArkUI-X&#xff09;中需要做到一套代碼同時支持多平臺構建&#xff0c;所以會采取共倉開發的方式&#xff0c;部分倉直接指向OpenHarmony相關開源倉。 代碼結構及倉庫結構 代…

多模態模型(MLLM)論文串燒

近期看了一些多模態方向的工作&#xff0c;包括圖像、文本多模態&#xff0c;圖像、視頻、語音、文本多模態&#xff0c;做個總結。 Yi Qwen-VL LLaVA MobileVLM LanguageBind Video-LLaVA VAST

【機器學習300問】94、什么是多任務學習?

一、多任務學習的定義 多任務學習&#xff08;Multi-Task Learning, MTL&#xff09;是一種機器學習范式&#xff0c;它允許一個模型同時學習執行多個相關但不完全相同的任務。這種方法的核心是&#xff1a;通過共享表示或權重&#xff0c;不同的任務可以在學習過程中相互促進&…

淺談微服務的自動化部署

一、常用部署工具 jenkins,docker生態是比較常用的工具&#xff0c;本文也主要是聊這幾個。其他如Kubernetes (K8s)&#xff0c;Ansible&#xff0c;GitLab CI/CD等工具本文只是暫時提一下&#xff0c;不展開討論。 二、比較jenkins和docker生態 1、jenkins 優點 jenkins功…

Rust使用rust_xlsxwriter庫把Vec數據寫入Excel

一、Rust使用rust_xlsxwriter庫把一維Vec數據寫入Excel 在Rust中&#xff0c;使用rust_xlsxwriter庫將一維Vec數據寫入Excel文件是一個相對簡單的過程。首先&#xff0c;你需要確保你的Cargo.toml文件中已經添加了rust_xlsxwriter依賴。以下是如何添加依賴的示例&#xff1a; …

KMP題解代碼(含講解)

目錄 注意: next數組的變化規律&#xff1a; 初始化&#xff1a; 求next數組部分&#xff1a; KMP部分&#xff1a; AC代碼&#xff1a; 題目鏈接&#xff1a;【模板】KMP - 洛谷 注意: 1、next數組是針對子串的&#xff0c;并未涉及母串&#xff0c;因此求next數組時…

Python中文件操作和異常處理

文章目錄 一、文件操作1.概念2.文件3.二進制 二、基本文件操作三、亂碼產生四、with open() as f五、代碼實現文件復制粘貼六、try ... except ...七、代碼比較 一、文件操作 1.概念 幫助我們把爬蟲抓下來的數據&#xff0c;進行保存。 2.文件 在計算機中&#xff0c;沒有p…

Linux:linux基礎

Linux 一套免費使用和自由傳播的操作系統 linux特點 免費,開源,多用戶(同時允許多用戶操作同一個Linux系統),多任務(同時允許多個任務執行) linux版本 分為內核版和發行版 內核版 由linus torvalds及其團隊進行開發和維護 免費,開源 負責控制硬件 發行版 基于linux內…

Luat學習

萬物互聯的興起 人與人之間的連接已經變得越來越緊密&#xff0c;至少在中國這是一個不爭的事實。 人們的忙碌程度也達到了前所未有的水平&#xff0c;這時候人的通訊能力反而成為了瓶頸&#xff0c;人與外界的信息交換方式無外乎是嘴說、耳朵聽、眼睛看、手指敲、每秒的傳輸速…

根據配置的mode環境顯示不同的index模板

引言&#xff1a;在項目開發中&#xff0c;遇到了開發環境和生產環境使用模板不同的情況&#xff0c;配置如下&#xff1a; 一、vue.config.js const path require(path) function resolve(dir){return path.join(__dirname,dir) } module.exports {chainWebpack: config &g…

力扣226. 翻轉二叉樹(DFS的兩種思路)

Problem: 226. 翻轉二叉樹 文章目錄 題目描述思路復雜度Code 題目描述 思路 涉及二叉樹的遞歸解法時往往需要考慮兩種思路&#xff1a; 1.在遞歸遍歷時執行題目需要的具體要求&#xff1b; 2.將一個大問題分解為多個小子問題 具體到本體&#xff1a; 思路1&#xff1a;遍歷 先…