C語言編程--17.有效的括號

題目:

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

有效字符串需滿足:

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

示例 1
輸入:s = “()”
輸出:true

示例 2
輸入:s = “()[]{}”
輸出:true

示例 3
輸入:s = “(]”
輸出:false

示例 4
輸入:s = “([])”
輸出:true

提示

1 <= s.length <= 104
s 僅由括號 ‘()[]{}’ 組成

代碼:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>// 定義鏈表節點結構體
// 每個節點包含一個字符數據和一個指向下一個節點的指針
typedef struct Node
{char data;  // 存儲字符數據struct Node *next;  // 指向下一個節點的指針
} Node;// 定義棧結構體
// 棧使用鏈表實現,top 指針指向棧頂節點
typedef struct
{Node* top;  // 棧頂指針
} Stack;// 初始化棧
// 該函數將棧的 top 指針置為 NULL,表示棧為空
void initStack(Stack* s)
{s->top = NULL;  // 將棧頂指針置為 NULL
}// 判斷棧是否為空
// 如果棧的 top 指針為 NULL,則棧為空,返回 1;否則返回 0
int isEmpty(Stack* s)
{return s->top == NULL;  // 判斷棧頂指針是否為 NULL
}// 入棧操作
// 該函數將一個字符壓入棧中
void push(Stack* s, char value)
{// 為新節點分配內存Node* newnode = (Node*)malloc(sizeof(Node));if (newnode == NULL){// 內存分配失敗,輸出錯誤信息printf("內存分配失敗!");return;}newnode->data = value;  // 將數據存入新節點newnode->next = s->top;  // 新節點的 next 指針指向原棧頂節點s->top = newnode;  // 更新棧頂指針為新節點
}// 出棧操作
// 該函數將棧頂元素彈出
void pop(Stack* s)
{if (isEmpty(s)){// 棧為空,輸出錯誤信息printf("棧為空");return;}Node* temp = s->top;  // 臨時指針指向棧頂節點char value = temp->data;  // 獲取棧頂節點的數據s->top = s->top->next;  // 更新棧頂指針為原棧頂節點的下一個節點free(temp);  // 釋放原棧頂節點的內存
}// 判斷字符串中的括號是否有效
// 該函數使用棧來檢查字符串中的括號是否匹配
bool isValid(char* s) {Stack stack;initStack(&stack);  // 初始化棧int n = strlen(s);  // 獲取字符串的長度for (int i = 0; i < n; i++){if (s[i] == '(' || s[i] == '{' || s[i] == '[')// 如果是左括號,直接入棧push(&stack, s[i]);else if (s[i] == ')' && stack.top && stack.top->data == '(')// 如果是右括號且棧不為空,并且棧頂元素是對應的左括號,則出棧pop(&stack);else if (s[i] == ']' && stack.top && stack.top->data == '[')// 如果是右括號且棧不為空,并且棧頂元素是對應的左括號,則出棧pop(&stack);else if (s[i] == '}' && stack.top && stack.top->data == '{')// 如果是右括號且棧不為空,并且棧頂元素是對應的左括號,則出棧pop(&stack);else// 其他情況,將字符入棧push(&stack, s[i]);}if (stack.top)// 如果棧不為空,說明有括號不匹配,返回 falsereturn false;else// 如果棧為空,說明所有括號都匹配,返回 truereturn true; 
}

代碼分析:

邏輯清晰:代碼結構清晰,將棧的基本操作(初始化、入棧、出棧、判斷是否為空)封裝成獨立的函數,提高了代碼的可讀性和可維護性。isValid 函數利用棧的特性來判斷括號是否匹配,邏輯簡潔明了。
內存管理:在入棧操作中,會檢查內存分配是否成功,避免了因內存分配失敗而導致的程序崩潰。在出棧操作中,會釋放棧頂節點的內存,避免了內存泄漏。
擴展性:棧的實現使用鏈表,易于擴展。如果需要存儲更多類型的數據,只需要修改 Node 結構體的 data 成員即可。

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

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

相關文章

代碼隨想錄算法訓練營第60期第十七天打卡

今天我們繼續進入二叉樹的下一個章節&#xff0c;今天的內容我在寫今天的博客前大致看了一下部分題目難度不算大&#xff0c;那我們就進入今天的題目。 第一題對應力扣編號為654的題目最大二叉樹 這道題目的坑相當多&#xff0c;我第一次題目沒有看明白就是我不知道到底是如何…

Burp靶場JWT學習筆記1

JWT(JSON Web Token) 從其名字就可以看出來&#xff0c;它具有表示身份的作用&#xff0c;其本質是將用戶信息儲存到一串json字符串中再將其編碼得到一串token JWT由三部分組成&#xff0c;分別是 Header&#xff0c;Payload&#xff0c;Signatrue JWTBase64(Header).Base6…

第53.5講 | 小項目實戰:用 SHAP 值解釋農作物產量預測模型 [特殊字符][特殊字符]

目錄 ? 項目背景 &#x1f4e6; 所用工具 &#x1f4c1; 數據字段&#xff08;模擬&#xff09; &#x1f9d1;?&#x1f4bb; 代碼實現步驟 &#x1f3af; 解讀與啟發 &#x1f9e0; 項目拓展建議 ? 項目背景 我們使用一個簡化的玉米產量數據集&#xff08;可模擬實…

極狐GitLab 合并請求依賴如何解決?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 合并請求依賴 (PREMIUM ALL) 在極狐GitLab 16.6 中引入了對復雜合并依賴關系的支持&#xff0c;通過名為 remove_mr_blockin…

Django DRF實現用戶數據權限控制

在 Django DRF 中使用 ModelViewSet 時&#xff0c;若需實現用戶僅能查看和操作自己的數據詳情&#xff0c;同時允許所有認證用戶訪問列表&#xff0c;需結合權限類和動態權限分配。以下是具體步驟&#xff1a; 1. 自定義對象權限類 創建一個 IsOwner 權限類&#xff0c;檢查…

【數據結構】——線性表之單鏈表

一、單鏈表的概念和結構 1、單鏈表的概念&#xff1a; 鏈表也是屬于我們的線性表中的一種&#xff0c;其物理結構上是不一定連續的&#xff0c;但是邏輯結構上是一定連續的&#xff0c;所以其是沒辦法像前面的順序表一樣通過找到下一個元素的&#xff0c;其是通過指針來找到下…

線程函數庫

pthread_create函數 pthread_create 是 POSIX 線程庫&#xff08;pthread&#xff09;中的一個函數&#xff0c;用于創建一個新的線程。 頭文件 #include <pthread.h> 函數原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…

2.5 橋梁橋面系及附屬結構施工

2.5.1 橋面系施工 1.排水設施 設置縱橫坡及泄水孔&#xff0c;減少橋面積水、防排結合。匯水槽、泄水孔頂面高程低于橋面鋪裝10-15mm。泄水孔邊緣設滲水盲溝泄水管下端至少應伸出構筑物底面100-150mm。泄水管通過豎向管道直接引至地面或雨水管線。豎向管道抱箍、卡環、定位卡…

docker 代理配置沖突問題

問題描述 執行 systemctl show --property=Environment docker 命令看到有如下代理配置 sudo systemctl show --property=Environment docker Environment=HTTP_PROXY=http://127.0.0.1:65001 HTTPS_PROXY=http://127.0.0.1:65001 NO_PROXY=127.0.0.1,docker.io,ghcr.io,uhub…

MATLAB基礎應用精講-【基礎知識篇】發布和共享 MATLAB 代碼

目錄 MATLAB發布代碼---生成文檔pdf 分節符對發布文件的分節 實時腳本 Matlab workspace與m腳本數據共享 發布和共享 MATLAB 代碼 在實時編輯器中創建和共享實時腳本 發布 MATLAB 代碼文件 (.m) 添加幫助和創建文檔 發布 MATLAB 代碼文件 (.m) 可創建包括您的代碼、注釋…

JDBC 批處理與事務處理:提升數據操作效率與一致性的密鑰

目錄 一. JDBC批量添加數據 1. 什么是批量添加數據 2. 實現數據的批量添加 a. 方式一&#xff1a;不分塊 二. JDBC事務處理 1. 什么是事務 2. JDBC事務處理實現 三. 總結 前言 本文來講解JDBC的批處理和事務處理 這對數據的安全性和準確性以及高效率提供很好的辦法 話不…

C++實現Atbash密碼

詳細說明 埃特巴什密碼是一種替換密碼&#xff0c;在該密碼中字母表中的字母是反向對應的。例如&#xff0c;A 會被替換為 Z&#xff0c;B 會被替換為 Y&#xff0c;依此類推。 #include <cassert> /// for assert #include <iostream> /// for IO operations #…

QuecPython+GNSS:實現快速定位

概述 QuecPython 結合 GNSS&#xff08;全球導航衛星系統&#xff09;模塊為物聯網設備提供開箱即用的定位能力解決方案。該方案支持 GPS/北斗/GLONASS/Galileo 多系統聯合定位&#xff0c;為物聯網開發者提供從硬件接入到云端服務的全棧式定位解決方案。 優勢特點 多體系定…

leetcode刷題日記——逆波蘭表達式求值

[ 題目描述 ]&#xff1a; [ 思路 ]&#xff1a; 借助棧的特性&#xff0c;遇見數字就將這個數壓入棧內&#xff0c;遇見符號&#xff0c;就從棧中彈出兩個數&#xff0c;進行相應的運算&#xff0c;然后將結果壓入棧中運行如下 int evalRPN(char** tokens, int tokensSize…

firewalld 詳解

firewalld 詳解 firewalld 是 Linux 系統中一個動態防火墻管理工具&#xff0c;取代了傳統的 iptables&#xff0c;提供更靈活、動態的規則配置&#xff0c;支持運行時修改且無需重載服務。以下是其核心概念、常用操作及示例指南&#xff1a; 一、核心概念 區域&#xff08;Zo…

面向高性能運動控制的MCU:架構創新、算法優化與應用分析

摘要&#xff1a;現代工業自動化、汽車電子以及商業航天等領域對運動控制MCU的性能要求不斷提升。本文以國科安芯的MCU芯片AS32A601為例&#xff0c;從架構創新、算法優化到實際應用案例&#xff0c;全方位展示其在高性能運動控制領域的優勢與潛力。該MCU以32位RISC-V指令集為基…

支付寶小程序組件與頁面構造器使用指南:從頁面到組件的正確遷移

引言 在支付寶小程序開發中&#xff0c;我們經常會遇到需要將頁面組件化的情況。本文將通過一個實際案例&#xff08;將 /pages/plugin/device 從頁面遷移到組件&#xff09;&#xff0c;深入分析支付寶小程序中頁面和組件的區別&#xff0c;以及正確的遷移方式。我們將從問題…

26-算法打卡-字符串-右旋字符串-第二十六天

1 題目說明 字符串的右旋轉操作是把字符串尾部的若干個字符轉移到字符串的前面。給定一個字符串 s 和一個正整數 k&#xff0c;請編寫一個函數&#xff0c;將字符串中的后面 k 個字符移到字符串的前面&#xff0c;實現字符串的右旋轉操作。 例如&#xff0c;對于輸入字符串 &qu…

fastbev mmdetection3D 角度和方向損失

角度/方向損失 sin(a?b)sinacosb?cosasinb config參數 dir_offset0.7854, # pi/4 dir_limit_offset0, box編解碼 # Copyright (c) OpenMMLab. All rights reserved. import torchfrom mmdet.core.bbox import BaseBBoxCoder from mmdet.core.bbox.builder import BBOX_COD…

極狐GitLab 如何 cherry-pick 變更?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 揀選(cherry-pick)更改 (BASIC ALL) 在 Git 中&#xff0c;cherry-pick 是從一個分支獲取一個提交并將其添加為另一個分支的…