3.1棧的應用—括號匹配
一、實驗目的1.掌握堆疊特殊線性表的儲存方式的基本操作方法。
2.掌握堆疊後進先出運算原則在解決實際問題中的應用。
3.掌握使用棧的原理來解決表示式中的括號配對問題。
二、實驗內容
假設乙個算術表示式中包含圓括弧、方括弧三種型別的括弧,編寫乙個程式用於判別表示式中括弧是否正確配對。
說明:檢驗表示式中的括號匹配情況:假設在乙個算術表示式中,可以包含三種括號:圓括號"("和")",方括號"["和"]",並且這兩種括號可以按任意的次序巢狀使用。比如,...[......[...]...]...(...)..。現在需要設計乙個演算法,用來檢驗在輸入的算術表示式中所使用括號的合法性。
算術表示式中各種括號的使用規則為:出現左括號,必有相應的右括號與之匹配,並且每對括號之間可以巢狀,但不能出現交叉情況。我們可以利用乙個棧結構儲存每個出現的左括號,當遇到右括號時,從棧中彈出左括號,檢驗匹配情況。在檢驗過程中,若遇到以下幾種情況之一,就可以得出括號不匹配的結論。
(1)當遇到某乙個右括號時,棧已空,說明到目前為止,右括號多於左括號;
(2)從棧中彈出的左括號與當前檢驗的右括號型別不同,說明出現了括號交叉情況;
(3)算術表示式輸入完畢,但棧中還有沒有匹配的左括號,說明左括號多於右括號。
演算法步驟:掃瞄表示式,
1)凡出現左括弧,則進棧;
2)凡出現右括弧,首先檢查棧是否空。
若棧空,則表明該「右括弧」多餘
否則和棧頂元素比較,
若相匹配,則「左括弧出棧」
否則表明不匹配
3)表示式檢驗結束時,
若棧空,則表明表示式中匹配正確
否則表明「左括弧」有餘
棧的型別定義及基本操作**可參考教材相關定義和程式。
三、實驗源**
四、實驗結果
演算法邏輯根據題目提示來就行了,由於特定題目所以沒有對書上的一些**進行了修改,比如沒有在彈出棧頂的時候設定變數儲存棧頂,直接下移棧頂指標(因為此題彈出的棧頂並沒有用了)
在編寫過程中遇到的若干問題:
0、switch函式的具體格式忘記了,以至於報了很多格式上的錯誤;
1、特別注意switch函式中多處判斷的邏輯
2、對於中括號在小括號中間這種情況並沒有檢測出來並報錯(如"()"),**還有進一步改進的空間
ps:編譯完成後並沒有進行多少資料測試,如若有bug還請批評指出!
#include#include#include#define maxsize 100
//封裝順序棧
typedef structseqstack,*pseqstack;
//初始化空棧
pseqstack init()
}//判空
int empty(pseqstack s)
//出棧
int pop(pseqstack s)
}//取棧頂元素
char gettop(pseqstack s)
}//銷毀棧
void destory(pseqstack *s) }
//入棧
int push(pseqstack s,char x)
else }
void judge(pseqstack s,char str)
int i;
for(i=0; str[i]!='\0'; i++)
//棧不空,驗證是否匹配
else
else
} break;
case ']':
//若棧空出現乙個右括號,則直接return
if(empty(s))
//棧不空,驗證是否匹配
else
else
} break;
default: break;
} }
//結束迴圈判斷棧是否空,空則匹配成功
if(empty(s))
else
printf("匹配失敗");
}void main()
棧應用 括號匹配
假設表示式中允許包含兩種括號 圓括號和方括號。編寫乙個演算法判斷表示式中的括號是否正確配對。由括號構成的字串,包含 如果匹配輸出yes,否則輸出no。複製 yes解決思想 拿到字串後,遍歷字串,當遇到左括號就進棧,右括號棧頂元素出棧,如果括號是匹配的,則最終棧空。include includetyp...
棧的應用 括號匹配
description 在實際程式設計中,我們經常會巢狀使用括號,如 如果括號太多,可能會出現括號不匹配的情況,比如 as 等。現希望你們編寫乙個程式,判斷輸入的一段語句中的括號是否匹配。必須使用棧實現這個功能。input 字串s,s是由 以及數字字母組成的字串。output 若括號使用規範且匹配,...
棧的應用(括號匹配)
棧的應用 括號匹配有兩種,一種是只用匹配一種型別的括號的,還有一種是要多種都匹配 棧的應用,括號的匹配問題 簡單的括號匹配 只有一中型別的括號 include include include include using namespace std 初始化棧 bool match string str...