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 若括號使用規範且匹配,...