C栈stack
棧是一種??特殊的線性表??
棧僅能在線性表的一端進行操作
棧頂(Top):允許操作的一端
棧底(Bottom):不允許操作的一端
Stack的常用操作
創(chuàng)建棧
銷毀棧
清空棧
進棧
出棧
獲取棧頂元素
獲取棧的大小?
?
| C語言描述=====》棧的設計與實現(xiàn)??人生財富庫積累 |
| #ifndef?_MY_STACK_H_ #define?_MY_STACK_H_ ? typedef?void?Stack; ? Stack*?Stack_Create(); ? void?Stack_Destroy(Stack*?stack); ? void?Stack_Clear(Stack*?stack); ? int?Stack_Push(Stack*?stack,?void*?item); ? void*?Stack_Pop(Stack*?stack); ? void*?Stack_Top(Stack*?stack); ? int?Stack_Size(Stack*?stack); ? #endif?//_MY_STACK_H_ |
| ? |
3.1.3棧模型和鏈表模型關系分析
?
棧的順序存儲設計與實現(xiàn)
基本概念
設計與實現(xiàn)
| 頭文件 |
| #ifndef??__MY_SEQLIST_H__? #define?__MY_SEQLIST_H__ ? typedef?void?SeqList; typedef?void?SeqListNode; ? SeqList*?SeqStack_Create(int?capacity); ? void?SeqStack?_Destroy(SeqStack?*?list); ? void?SeqStack?_Clear(SeqStack?*?list); ? int?SeqStack?_Length(SeqStack?*?list); ? int?SeqStack?_Capacity(SeqStack?*?list); ? int?SeqStack?_Insert(SeqStack?*?list,?SeqListNode*?node,?int?pos); ? SeqListNode*?SeqList_Get(SeqList*?list,?int?pos); ? SeqListNode*?SeqList_Delete(SeqList*?list,?int?pos); ? #endif??//__MY_SEQLIST_H__ ? |
?
3.1.5棧的鏈式存儲設計與實現(xiàn)
?
設計與實現(xiàn)
| 頭文件 |
| #ifndef?_MY_LINKSTACK_H_ #define?_MY_LINKSTACK_H_ ? typedef?void?LinkStack; ? LinkStack*?LinkStack_Create(); ? void?LinkStack_Destroy(LinkStack*?stack); ? void?LinkStack_Clear(LinkStack*?stack); ? int?LinkStack_Push(LinkStack*?stack,?void*?item); ? void*?LinkStack_Pop(LinkStack*?stack); ? void*?LinkStack_Top(LinkStack*?stack); ? int?LinkStack_Size(LinkStack*?stack); ? #endif?//_MY_LINKSTACK_H_ |
?
3.1.6棧的應用
案例1:就近匹配
| 應用1:就近匹配? |
| 幾乎所有的編譯器都具有檢測括號是否匹配的能力 如何實現(xiàn)編譯器中的符號成對檢測? #include?<stdio.h>?int?main()?{?int?a[4][4];?int?(*p)[4];?p?=?a[0];?return?0;? ? |
| 算法思路 從第一個字符開始掃描 當遇見普通字符時忽略, 當遇見左符號時壓入棧中 當遇見右符號時從棧中彈出棧頂符號,并進行匹配 匹配成功:繼續(xù)讀入下一個字符 匹配失敗:立即停止,并報錯 結束: 成功:?所有字符掃描完畢,且棧為空 失敗:匹配失敗或所有字符掃描完畢但棧非空 |
| 當需要檢測成對出現(xiàn)但又互不相鄰的事物時 可以使用棧“后進先出”的特性 棧非常適合于需要“就近匹配”的場合 |
| ? |
| 計算機的本質工作就是做數(shù)學運算,那計算機可以讀入字符串 “9?+?(3?-?1)?*?5?+?8?/?2”并計算值嗎? |
?
案例2:中綴表達式和后綴表達式
| 應用2:中綴?后綴 | ||||
| 計算機的本質工作就是做數(shù)學運算,那計算機可以讀入字符串 “9?+?(3?-?1)?*?5?+?8?/?2”并計算值嗎? | ||||
| 后綴表達式??==?符合計算機運算 波蘭科學家在20世紀50年代提出了一種將運算符放在數(shù)字后面的后綴表達式對應的, 我們習慣的數(shù)學表達式叫做中綴表達式===》符合人類思考習慣 ? | ||||
| 實例: 5?+?4=>?5?4?+?? 1?+?2?*?3?=>?1?2?3?*?+?? 8?+?(?3?–?1?)?*?5?=>?8?3?1?–?5?*?+?? | ||||
| 中綴表達式符合人類的閱讀和思維習慣 后綴表達式符合計算機的“運算習慣” 如何將中綴表達式轉換成后綴表達式? | ||||
| 中綴轉后綴算法: | ||||
| 遍歷中綴表達式中的數(shù)字和符號 對于數(shù)字:直接輸出 對于符號: 左括號:進棧?? 運算符號:與棧頂符號進行優(yōu)先級比較 若棧頂符號優(yōu)先級低:此符合進棧??(默認棧頂若是左括號,左括號優(yōu)先級最低) 若棧頂符號優(yōu)先級不低:將棧頂符號彈出并輸出,之后進棧 右括號:將棧頂符號彈出并輸出,直到匹配左括號 遍歷結束:將棧中的所有符號彈出并輸出 中綴轉后綴
|
總結
- 上一篇: 服务器和前台采用JSON通讯
- 下一篇: App热补丁动态修复技术介绍