數據結構:棧和隊列(上)

匯總代碼見:登錄 - Gitee.com

上一篇文章:數據結構:雙向鏈表-CSDN博客

與本文相關的結構體傳參:自定義類型:結構體-CSDN博客

1.棧

1.1概念和結構

棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(LastInFirstOut)的原則。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操作叫做出棧。出數據也在棧頂

棧底層結構選型:

棧的實現一般可以使用數組或者鏈表實現,相對而言,數組的結構實現更優一些。

原因:在入棧和出棧的時間復雜度均為O(1)的前提條件下,數組的內存利用率遠高于鏈表,尤其是在存儲小數據類型時。

1.2棧的實現

依舊建立三個文件:

1.2.1定義棧的結構


//定義棧的結構
typedef int STDataType;
typedef struct Stack {STDataType* arr;int top;//指向當前棧頂元素的索引--正好為棧中有效的數據個數int capacity;//棧的空間大小
}ST;

1.2.2初始化

//初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->size = 0;
}

調用調試:

1.2.3銷毀

//銷毀
void STDesTroy(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

1.2.4入棧

// ?棧
void STPush(ST* ps, STDataType x)
{assert(ps);//判斷空間是否足夠if (ps->top == ps->capacity){//增容int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空間足夠ps->arr[ps->top++] = x;
}

調用測試:

STPush(&st, 1);
STPush(&st, 2);
STPush(&st, 3);
STPush(&st, 4);
STPush(&st, 5);

1.2.5判空

//棧是否為空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

1.2.6出棧

//出棧
void STPop(ST* ps)
{assert(!STEmpty(ps));ps->top--;
}

調用測試:

1.2.7取棧頂元素

top為指向當前棧頂元素的索引,所以需要-1。

//取棧頂元素
STDataType STTop(ST* ps)
{assert(!STEmpty(ps));return ps->arr[ps->top - 1];
}

調用測試:

while (!STEmpty(&st))
{//取棧頂STDataType top = STTop(&st);printf("%d ", top);//出棧STPop(&st);
}
printf("\n");

1.2.8獲取棧中有效元素個數

//獲取棧中有效元素個數
int STSize(ST* ps)
{assert(ps);return ps->top;
}

調用測試:

printf("size:%d\n",STSize(&st));

1.3解釋assert(ps)與assert(!STEmpty)

assert(ps):保證傳入的為有效的棧結構體變量。限制參數不能為空。

assert(!STEmpty):保證棧中的有效個數不能為空。

2.力扣算法題:有效的括號

20. 有效的括號 - 力扣(LeetCode)

理解題意:

思路:借助棧,遍歷字符串,如果遇到左括號,就將字符串入棧,如果遇到右括號,就取棧頂,將其與右括號相比較,相同則出棧。

編程中遇到的問題:有空字符串或者遇到一開始就是右括號的,需要判斷棧是否為空以及對于條件表達式的使用錯誤。

代碼如下:

// 需要借助棧
// 定義棧的結構
typedef char STDataType;
typedef struct Stack {STDataType* arr;int top;      // 指向當前棧頂元素的索引--正好為棧中有效的數據個數int capacity; // 棧的空間大小
} ST;
// 初始化
void STInit(ST* ps) {ps->arr = NULL;ps->capacity = ps->top = 0;
}// 銷毀
void STDesTroy(ST* ps) {if (ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}// ?棧
void STPush(ST* ps, STDataType x) {assert(ps);// 判斷空間是否足夠if (ps->top == ps->capacity) {// 增容int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp =(STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL) {perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}// 空間足夠ps->arr[ps->top++] = x;
}// 棧是否為空
bool STEmpty(ST* ps) {assert(ps);return ps->top == 0;
}// 出棧
void STPop(ST* ps) {assert(!STEmpty(ps));ps->top--;
}// 取棧頂元素
STDataType STTop(ST* ps) {assert(!STEmpty(ps));return ps->arr[ps->top - 1];
}// 獲取棧中有效元素個數
int STSize(ST* ps) {assert(ps);return ps->top;
}
// 以上為棧結構的定義與常見方法
bool isValid(char* s) {ST st;STInit(&st);char* i = s;while (*i != '\0') {// 左括號入棧if (*i == '(' || *i == '[' || *i == '{') {STPush(&st, *i);} else {// 右括號取棧頂,出棧或返回false// 若第一個為右括號,為空棧if (STEmpty(&st)) {STDesTroy(&st);return false;}char top = STTop(&st);if((top == '[' && *i != ']') || (top == '{' && *i != '}')|| (top == '(' && *i != ')')){STDesTroy(&st);return false;} //匹配-出棧STPop(&st);}i++;}// 棧是否為空//  if(STEmpty(&st))//  {//      STDesTroy(&st);//      return true;//  }// STDesTroy(&st);// return false;bool ret = STEmpty(&st) ? true : false;STDesTroy(&st);return ret;
}

最終通過測試。

本章完。

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

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

相關文章

文檔抽取技術:提取非結構化文檔中的關鍵信息,提升檔案管理、金融保險和法律合規領域的效率與準確性

在信息爆炸的時代,各種機構、企業等都面臨著海量非結構化文檔數據的挑戰。報告、合同、票據、檔案記錄、法律文書等文檔中蘊藏著巨大的數據,但傳統依靠人工閱讀、理解和錄入的方式效率低下、成本高昂且容易出錯。文檔抽取技術作為人工智能和自然語言處理…

雷柏VT1 MAX評測:原生中小手形電競鼠標 但既不僅限于中小手形 也不僅限于電競

一、前言:真正針對中小手形設計的電競鼠標 雷柏第二代VT系列電競鼠標我們已經體驗過很多款了,基本都是針對大中手形設計的外形模具,只有VT3s系列是VT3系列的縮小版,更適合中小手形使用,但也只是對中大手形模具重新優化…

新客戶 | TDengine 時序數據庫賦能開源鴻蒙物聯展區實時監控與展示

在工業物聯網快速發展的當下,企業普遍面臨著兩大挑戰:一是設備種類繁多、接入標準不一,導致系統建設容易陷入“數據孤島”;二是實時監控和多場景聯動的需求越來越強烈,但傳統數據庫在高頻寫入與多維分析上難以兼顧&…

深入剖析 ConcurrentHashMap:Java 并發編程的基石

目錄 【1】Java 7 中 ConcurrentHashMap 的實現原理 1.分段鎖(Segment) 2. 數據結構 3. 操作流程 【2】Java 8 中 ConcurrentHashMap 的改進 1.紅黑樹的引入 2.CAS 操作 3.數據結構的變化 【3】ConcurrentHashMap 的常用方法及使用示例 1.put(…

【會員專享數據】2020-2022年我國鄉鎮的逐日地表氣壓數據(Shp/Excel格式)

之前我們分享過2020—2022年中國0.01分辨率逐日地表氣壓柵格數據(可查看之前的文章獲悉詳情)!該數據是研究者張凌, 胡英屹等發布在國家冰川凍土沙漠科學數據中心平臺上的高分辨地表氣壓數據。很多小伙伴拿到數據后反饋柵格數據不太方便使用&a…

第二階段WinForm-12:UI控件庫

1_驗證碼與條形碼 1.1_條碼基礎知識 條碼:條碼是由一組按一定編碼規則排列的條、空符號組成,用以表示一定的字符、數字及符號組成的信息 1.2_一維碼 (1)Code 128 Code 128 是一種密度很高的字母數字代碼系統,可對其…

別再誤會了!Redis 6.0 的多線程,和你想象的完全不一樣

技術解析核心誤區:Redis 6.0是完全多線程的嗎?No. Redis 6.0引入的多線程,只用于網絡I/O的讀寫和數據的解析。而核心的命令執行(比如 GET, SET, HGETALL 等)依然是單線程的。Redis的架構演進,就像是把一個復…

23種設計模式——抽象工廠模式(Abstract Factory Pattern)詳解

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。 🍎個人主頁:Meteors.的博客 💞當前專欄:設計模式 ?特色專欄:知識分享 &#x…

本地部署開源數據生成器項目實戰指南

本地部署開源數據生成器項目實戰指南 前言 在當今大數據和人工智能時代,高質量數據集對于模型訓練和算法開發至關重要。然而,獲取真實且合規的數據集往往面臨隱私、成本和法律等多重挑戰。合成數據生成技術為此提供了優雅的解決方案,它能夠…

2025React面試題集錦

1. React 是什么?它有哪些主要特點? React 是由Facebook開發的開源JavaScript庫,用于構建用戶界面(UI),尤其適合開發復雜的單頁應用(SPA)。 主要特點: 聲明式編程:只需描述UI應該是什么樣子(如return <div>Hello</div>),React會自動處理DOM更新,無需…

設計模式:迭代器模式(Iterator Pattern)

文章目錄一、概念二、實例分析三、示例代碼一、概念 迭代器模式 是一種 行為型設計模式&#xff0c;用于在不暴露集合對象內部結構的前提下&#xff0c;順序訪問集合中的元素。 換句話說&#xff1a; 集合類只負責數據存儲&#xff1b;迭代器類負責遍歷集合&#xff1b;使用者…

Vue 3 學習路線指南

階段一:基礎入門 (1-2周) 1.1 環境準備 # 安裝 Node.js (推薦 18+ 版本) # 安裝 Vue CLI 或使用 Vite npm create vue@latest my-vue-app cd my-vue-app npm install npm run dev1.2 Vue 3 核心概念 響應式系統:ref(), reactive(), computed() 組合式 API:setup() 函數 模…

使用 `hover:not-[:has(:hover)]` 避免「父元素和子元素同時 hover」時的樣式沖突

:hover:not-(:has(:hover)) has() CSS 4 引入的“父選擇器”&#xff0c;意思是&#xff1a;匹配那些里面包含某個子元素/狀態的元素。 例如&#xff1a;:has(:hover) 表示「自身包含正在被 hover 的子元素」。 :not() 取反偽類&#xff0c;表示不匹配里面的條件。 比如我…

第三十天-DMA串口實驗

一、DMA概述二、DMA通道注意&#xff0c;想要往串口中寫數據&#xff0c;外部請求信號應該是USARTx_TX&#xff0c;當DR寄存器為空時&#xff0c;產生TX信號&#xff0c;請求DMA。反之&#xff0c;從串口中讀數據&#xff0c;外部請求信號應該是USARTx_RX&#xff0c;當DR寄存器…

C/C++ 中的inline(內聯函數關鍵字)詳解

在 C/C 編程中&#xff0c;函數調用雖然帶來了代碼復用和可讀性提升&#xff0c;但頻繁調用小型函數可能會產生額外的調用開銷&#xff08;call overhead&#xff09;&#xff0c;比如棧幀的建立與銷毀、參數傳遞等。 為了減少這種開銷&#xff0c;C 引入了 inline&#xff08;…

2025 年高教社杯全國大學生數學建模競賽A 題 煙幕干擾彈的投放策略完整成品 思路 模型 代碼 結果 全網首發高質量!!!

煙幕干擾彈主要通過化學燃燒或爆炸分散形成煙幕或氣溶膠云團,在目標前方特定空域形成遮蔽&#xff0c;干擾敵方導彈&#xff0c;具有成本低、效費比高等優點。隨著煙幕干擾技術的不斷發展&#xff0c;現已有多種投放方式完成煙幕干擾彈的定點精確拋撒,即在拋撒前能精確控制煙幕…

嵌入式第四十五天(51單片機相關)

一.1.CPU、MPU、MCU、GPU&#xff1a; CPU&#xff08;中央處理器&#xff09;&#xff1a;計算機的核心部件&#xff0c;負責執行指令和處理數據。 MPU&#xff08;微處理器&#xff09;&#xff1a;通常指更通用的處理器&#xff0c;強調計算能力。 MCU&#xff08;微控制器&…

今天面了一個Java后端工程師,真的讓我猛抬頭

今天面了一個Java后端工程師,真的讓我猛抬頭啊. 現在面試不像傳統的八股文面試,我更多問的都是項目場景相關的問題,但是都能回答的不錯.這一點我還是很驚訝的。 不僅如此,她的技術也很扎實,對Java核心機制&#xff08;JVM、并發、集合等&#xff09;理解深入&#xff0c;回答…

攔截器和過濾器(理論+實操)

攔截器和過濾器 本文旨在夯實基礎以及實戰加深理解,目的是更深的理解以便掌握,希望能跟著動手敲一遍,絕對受益匪淺 在本文,我會先給出兩者的區別(理論知識),隨后是兩者各自的實操實現 文章目錄攔截器和過濾器什么是過濾器和攔截器?1.過濾器2.攔截器執行整體流程攔截器和過濾器…

HTB 賽季8靶場 - Guardian

各位好&#xff0c;最近我的kali崩掉了&#xff0c;崩掉了&#xff0c;建議大家避K 番茄C盤瘦身&#xff0c;這家伙修改了我的avrt.dll文件&#xff0c;導致virtualbox不接受我的avrt.dll文件的簽名了&#xff0c;從而導致virtualbox的虛擬機環境全崩無法開機。弄了幾天&#x…