C棧stack

來源:互聯網
上載者:User

標籤:

棧是一種  特殊的線性表  

棧僅能線上性表的一端進行操作

棧頂(Top):允許操作的一端

棧底(Bottom):不允許操作的一端

Stack的常用操作

建立棧

銷毀棧

清空棧

進棧

出棧

擷取棧頂元素

擷取棧的大小 

 

C語言描述=====》棧的設計與實現  人生財富庫積累

#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棧模型和鏈表模型關係分析

 

棧的順序儲存設計與實現基本概念

設計與實現

標頭檔

#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棧的鏈式儲存設計與實現

 

設計與實現

標頭檔

#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:就近匹配 

幾乎所有的編譯器都具有檢測括弧是否匹配的能力

如何?編譯器中的符號成對檢測?

#include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0; 

 

演算法思路

從第一個字元開始掃描

當遇見一般字元時忽略,

當遇見左符號時壓入棧中

當遇見右符號時從棧中彈出棧頂符號,並進行匹配

匹配成功:繼續讀入下一個字元

匹配失敗:立即停止,並報錯

結束:

成功: 所有字元掃描完畢,且棧為空白

失敗:匹配失敗或所有字元掃描完畢但棧非空

當需要檢測成對出現但又互不相鄰的事物時

可以使用棧“後進先出”的特性

棧非常適合於需要“就近匹配”的場合

 

電腦的本質工作就是做數學運算,那電腦可以讀入字串

“9 + (3 - 1) * 5 + 8 / 2”並計算值嗎?

 

案例2:中綴運算式和尾碼運算式

應用2:中綴 尾碼

電腦的本質工作就是做數學運算,那電腦可以讀入字串

“9 + (3 - 1) * 5 + 8 / 2”並計算值嗎?

尾碼運算式  ==?符合電腦運算

波蘭科學家在20世紀50年代提出了一種將運算子放在數字後面的尾碼運算式對應的,

我們習慣的數學運算式叫做中綴運算式===》符合人類思考習慣

 

執行個體:

5 + 4=> 5 4 +  

1 + 2 * 3 => 1 2 3 * +  

8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * +  

中綴運算式符合人類的閱讀和思維習慣

尾碼運算式符合電腦的“運算習慣”

如何將中綴運算式轉換成尾碼運算式?

中綴轉尾碼演算法:

遍曆中綴運算式中的數字和符號

對於數字:直接輸出

對於符號:

左括弧:進棧  

運算子號:與棧頂符號進行優先順序比較

若棧頂符號優先順序低:此符合進棧  (預設棧頂若是左括弧,左括弧優先順序最低)

若棧頂符號優先順序不低:將棧頂符號彈出並輸出,之後進棧

右括弧:將棧頂符號彈出並輸出,直到匹配左括弧

遍曆結束:將棧中的所有符號彈出並輸出

中綴轉尾碼

電腦是如何基於尾碼運算式計算的?

8 3 1 – 5 * + 

遍曆尾碼運算式中的數字和符號

對於數字:進棧

對於符號:

從棧中彈出右運算元

從棧中彈出左運算元

根據符號進行運算

將運算結果壓入棧中

遍曆結束:棧中的唯一數字為計算結果

棧的神奇!    

中綴運算式是人習慣的表達方式

尾碼運算式是電腦喜歡的表達方式

通過棧可以方便的將中綴形式變換為尾碼形式

中綴運算式的計算過程類似程式編譯啟動並執行過程  

 

擴充:給你一個字串,計算結果

“1 + 2 * (66 / (2 * 3) + 7 )”   

1

字串解析

詞法文法分析

優先順序分析     

資料結構選型===》棧還是樹?

C棧stack

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.