国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Chapter_3表、棧和隊列:棧

2019-11-11 04:42:12
字體:
供稿:網(wǎng)友

1、棧模型的引進

From百度百科(修改):棧,是一種運算受限的線性表。僅允許在表的一端(棧頂)進行插入和刪除運算,另一端稱為棧底。 運算:Push:向棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素。 Pop:從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

如下圖為模型圖: 這里寫圖片描述 這里寫圖片描述

2、棧的指針鏈表實現(xiàn)

類似于鏈表的指針實現(xiàn),棧的鏈表形式實現(xiàn)也差不多,思路比較清晰。

// _Stack_H.h#ifndef _Stack_Hstruct Node;typedef struct Node * PtrToNode;typedef PtrToNode Stack;int Isempty(Stack S);Stack CreateStack(void);// void DisposeStack(void);void MakeEmpty(Stack S);int Push(ElementType X,Stack S); /*新元素進棧操作*/ElementType Top(Stack S); /*返回棧頂元素*/int Pop(Stack S); /*棧頂元素出棧*/#endif/*Implementation of Functions*/#include <stdio.h>#include <stdlib.h>#include '_Stack_H.h'struct Node{ ElementType Element; PtrToNode Next; /* data */};/*測試棧是否為空*/int Isempty(Stack S){ return S->Next==NULL;}/*創(chuàng)建一個空棧,即棧初始化*/void MakeEmpty(Stack S){ if(S==NULL) { 3、棧的數(shù)組實現(xiàn)

數(shù)組實現(xiàn)時,感覺相對指針的有點不習(xí)慣。聲明結(jié)構(gòu)體時,鏈表的是以包括一個元素和一個指針的節(jié)點實現(xiàn)的;而數(shù)組的是包括三個量:棧的容量(自定),TopOfStack(棧頂狀態(tài))以及一個數(shù)組指針(儲存棧中的數(shù)據(jù))。以下為區(qū)別:

//鏈表實現(xiàn)的結(jié)構(gòu)體聲明struct Node{ ElementType Element; PtrToNode Next;};//另一個不同點:設(shè)置空棧條件&棧容量最小值#define EmptyTOS (-1)#define MinStackSize (5)//數(shù)組實現(xiàn)的結(jié)構(gòu)體聲明struct StackRecord{ int capacity; int TopOfStack; ElementType * Array;}

其中TOS(TopOfStack)為棧頂在數(shù)組中的位置,且-1時表示空棧(棧下溢),如TOS=N-1(N為容量),則表示棧滿了;TOS=0,表示棧只有一個元素(棧底元素)。 數(shù)組編號從棧底為0開始編號。 因此,此時處理棧就不像鏈表那樣對節(jié)點進行處理(其實,鏈表中的節(jié)點等同于把Array數(shù)組每個元素分開處理),而是對整個棧(Array) 進行處理。則有如下算法規(guī)則: 這里寫圖片描述

截圖來源于百度百科

即有: Push:先判斷是否棧滿。若不滿,則TOS加1,令Stack[TOS]=X。若棧滿,則報錯。 Pop:先判斷是否棧空。若不空,先彈出棧頂元素Stack(TOS),令Temp=Stack(TOS),再有TOS減1。若空,則報錯。

4、棧的應(yīng)用

1.平衡符號 如下為原書原話: 這里寫圖片描述

舉個例子,對“ [ ( ] ) “進行判斷。讀入”[“和”(“時,為開放符號,入棧。讀入”]“(右方括號),為封閉符號,此時棧不空,將棧頂”(“(左圓括號)彈出,發(fā)現(xiàn)不匹配,報錯。 還有就是,如果讀取到文件尾,棧非空也報錯。

2.后綴表達式 后綴記法,也被稱為逆波蘭記法。一般標(biāo)準(zhǔn)表達式,如1?2+3+5?6,又稱為中綴表達式,其對應(yīng)的后綴表達式為12?3+56?+

(1)后綴表達式的計算 以6523+8?+3+? 為例計算后綴表達式的值。利用棧計算,有以下原則

當(dāng)遇到數(shù)字時,將其壓棧。當(dāng)遇到運算符時,將棧中棧頂兩個元素彈出,進行該運算符的運算 如下為原書例子 這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

(2)中綴到后綴的轉(zhuǎn)換 對于中綴到后綴的轉(zhuǎn)換,比較復(fù)雜。書中只討論有+*() 四種運算符的情況(加號,乘號,左圓括號,右圓括號)。有如下轉(zhuǎn)換原則: 首先,假設(shè)中綴表達式是合法的,即正確的。 運算符優(yōu)先級有從低到高是:+*()

初始化一個空棧,讀取時從左到右讀取字符(因為涉及的都是從左到右運算的運算符,若像取冪運算符,則不行)當(dāng)遇到數(shù)字時,不壓入棧,直接輸出當(dāng)棧為空時,讀到的第一個運算符直接壓棧。(因為假設(shè)原表達式合法,即不存在右圓括號在前,左的在后的情況)當(dāng)棧非空(即有運算符在里面),讀到運算符A時,從棧中彈出棧元素直到發(fā)現(xiàn)優(yōu)先級比A更低為止。左右圓括號為例外。即(要直到遇到)才出棧 其實,還是例子生動,詳細例子見網(wǎng)站:

http://www.nowamagic.net/librarys/veda/detail/2307

這個例子較好。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 合水县| 抚顺县| 曲麻莱县| 武宣县| 仪陇县| 青浦区| 高阳县| 三都| 兴宁市| 永定县| 赫章县| 页游| 保定市| 宜阳县| 苍溪县| 新密市| 高阳县| 新干县| 德令哈市| 始兴县| 仁布县| 白城市| 铜梁县| 壤塘县| 盐边县| 崇州市| 定安县| 巴中市| 新巴尔虎右旗| 嘉荫县| 滨州市| 鹤岗市| 南川市| 获嘉县| 通山县| 南部县| 南宁市| 黄冈市| 襄垣县| 中超| 大安市|