棧的應用(括號匹配演算法實戰)

2022-07-02 11:42:09 字數 3561 閱讀 4047

1.實驗目的

棧(stack)是線性結構的核心內容之一。本實驗要求用高階語言c語言編寫基於棧的順序儲存結構實現棧的入棧、出棧、取棧頂元素和判空操作,並基於上述棧的基本操作實現括號匹配演算法,完成實驗報告的填寫,以便加深理解有關棧結構的抽象資料型別等概念,並體會和了解棧結構在日常使用者輸入操作中的應用價值。

2.實驗內容

1)構建乙個棧的順序儲存結構的抽象資料型別,通常應包含如下步驟

a.定義用來描述順序棧結構的結構體變數型別sqstack;

b.編寫乙個順序棧初始化演算法,記為initstack操作(函式);

c.編寫乙個順序棧資料元素入棧演算法,記為push操作(函式);

d.編寫乙個順序棧資料元素出棧演算法,記為pop操作(函式);

e.編寫乙個取棧頂元素演算法,記為gettop操作(函式);

f.編寫乙個判空演算法,記為isempty操作(函式);

2基於上述棧的基本操作實現括號匹配演算法:

a.在main函式內部編寫乙個括號匹配演算法,要求從鍵盤上輸入乙個

表示式,判斷這個表示式中的括號是否匹配;

b.測試實驗結果,評估實驗過程.

3完成實驗報告的填寫

順序棧結構的邏輯結構原理如下:

棧結構的邏輯結構

括號匹配的邏輯結構原理如下:

括號匹配的邏輯結構

利用棧結構後進先出的有限操作特點,通過入棧和出棧的操作來實現對表示式括號匹配正確與否的判斷.

二、實驗過程

1.順序棧結構體定義

首先用c/c++開發環境新建原始檔,首先鍵入如下預定義命令列:

圖1 原始檔預定義命令列

注意這裡需要#include命令列引用string.h標頭檔案,因為該檔案裡包含後面操作所需要的strlen庫函式,用於獲取字串的長度。

接著,根據順序棧的邏輯結構原理圖,定義用來描述順序棧資料物件的結構體變數型別sqstack,**如下:

圖2順序棧的結構體型別定義

這裡用char作為順序棧資料元素的資料型別,得到sqstack(順序棧結構體變數)的定義。其中用base表示棧底指標,用top表示棧頂指標,用stacksize表示當前棧的大小(即順序棧中資料元素的個數)。

2. initstack函式

編寫順序棧的初始化操作,首先對傳入的sqstack型引數分配初始大小的儲存空間,這裡用100個char的大小來初始化順序棧,如果記憶體分配失敗則退出程式,否則將s.base賦給s.top,stack_init_size賦給s.stacksize。

**如下:

圖3 initstack函式

3. isempty函式

判空操作:如果棧底指標與棧頂指標相等,則順序棧為空,反之非空。棧是否為空是字串序列中括號是否匹配的判斷依據。

圖4 isempty函式

4. push、pop和gettop函式

圖 5 push函式

push函式實現入棧操作,如果棧已滿,則動態增加順序棧的記憶體,將傳入的引數e賦給當前棧頂指標所指向的棧內元素,賦值結束後棧頂指標自動上移(自加)。

圖 6 gettop函式

gettop函式實現取棧頂元素操作,如果棧為空,則操作失敗,否則將棧頂指標的下一位指標所指向的資料元素賦給引數e,賦值結束返回e。

圖 7 pop函式

pop函式實現出棧操作,如果為空,則操作失敗,將棧頂指標的下一位指標所指向的資料元素賦給引數e,賦值結束後棧頂指標自動下移(自減)。

5.括號匹配演算法的實現

圖8 括號匹配演算法

1. 宣告乙個大小為maxsize(巨集定義)的char型陣列,並初始化;

2. 宣告兩個char型變數m,n;

3. 用char型陣列a來接收從使用者介面輸入的字串序列,getchar用於消化最後一次enter鍵字元輸入;

4. length表示字串的長度;

5. 宣告乙個sqstack型別變數並初始化;

6. 用for迴圈來實現括號匹配的迭代過程,如果迭代獲得的當前字元為(、、]就呼叫gettop函式取棧頂元素判斷是否與當前字元相等,如果相等則實現出棧操作,如果不相等則輸出「括號不匹配」並返回0退出程式;

7. 如果在for迴圈中沒有意外退出程式的前提下,繼續進行判空操作,如果順序棧為空,則括號匹配,反之不匹配;

8. 編譯執行,測試**.

三、實驗結果

圖9 實驗結果

實驗結果與預期目標一致,能夠正確**字串序列是否括號匹配。

四、實驗總結

通過「棧的應用」這個實驗,深入了解到採用棧結構處理日常生活中的使用者操作無處不在,在實現括號匹配演算法的過程中,主要利用棧結構後進先出的特性以及棧的入棧、出棧、取棧頂元素和判空操作來實現。其次從鍵盤上輸入乙個字串表示式,判斷這個表示式中的括號是否匹配來測試**的正確性。

在實驗的過程中,體會到了棧結構的順序儲存方式的優點,就本實驗而言,由於輸入的表示式資料量不是特別大,順序結構滿足演算法的實現。同時節省了一些儲存空間的開銷。

棧結構不僅僅可以用來處理括號匹配的判斷問題,還可以實現函式的遞迴呼叫,使得程式的執行有確定的入口和出口,為高效地演算法實現提供了基礎。

總的來說加深理解有關棧結構的抽象資料型別等概念,並體會和了解棧結構在日常使用者輸入操作中的應用價值。

棧應用 括號匹配

假設表示式中允許包含兩種括號 圓括號和方括號。編寫乙個演算法判斷表示式中的括號是否正確配對。由括號構成的字串,包含 如果匹配輸出yes,否則輸出no。複製 yes解決思想 拿到字串後,遍歷字串,當遇到左括號就進棧,右括號棧頂元素出棧,如果括號是匹配的,則最終棧空。include includetyp...

棧的應用 括號匹配

3.1棧的應用 括號匹配 一 實驗目的1 掌握堆疊特殊線性表的儲存方式的基本操作方法。2 掌握堆疊後進先出運算原則在解決實際問題中的應用。3 掌握使用棧的原理來解決表示式中的括號配對問題。二 實驗內容 假設乙個算術表示式中包含圓括弧 方括弧三種型別的括弧,編寫乙個程式用於判別表示式中括弧是否正確配對...

棧的應用 括號匹配

description 在實際程式設計中,我們經常會巢狀使用括號,如 如果括號太多,可能會出現括號不匹配的情況,比如 as 等。現希望你們編寫乙個程式,判斷輸入的一段語句中的括號是否匹配。必須使用棧實現這個功能。input 字串s,s是由 以及數字字母組成的字串。output 若括號使用規範且匹配,...