假設只允許出現兩種括號:圓括號和方括號,其巢狀順序隨意,即不管[()]或[()]等都為正確匹配,但是形如([)就成為錯誤的匹配。
可以用「期待的緊急程度」的概念來描述:
如 [()] 共8個括號,從左往右依次標代號為1-8,即第乙個[代號為1,第二個(代號為2,第三個[代號為3,依次類推
當計算機收到了第乙個括號後,期待它與第八個括號匹配,然而等來的卻是第二個括號,此時第乙個括號『[』只能暫時靠邊,第二個括號的急迫程度又大於第乙個括號,期待與之匹配的第七個括號的到來,然而卻等來了第三個括號,這時第二個括號又要暫時靠邊,第三個括號的急迫程度比第二個括號大,期待與之匹配的第四個括號的到來,第四個括號到來後與第三個括號相匹配,所以第三個括號的急迫就解決了。此時急迫程度最大的變成了第二個括號了,依次類推下去。
啊,我估計各位看完上面一小段的描述之後,可能覺得天花亂墜,雲裡霧裡的。下面就用比較通俗的語言來說一下。
首先計算機接收一串括號表示式,如[()],這時乙個乙個括號的檢查。
1.建立乙個空棧,用於存放左括號和表達相應左括號的急迫程度,棧頂的左括號的急迫程度為1,其他非棧頂左括號的急迫程度為0,顯然棧頂左括號的急迫程度大於非棧頂的左括號急迫程度;
2.若第乙個括號是左括號,不管是『(』還是『[』,都被壓棧,急迫度為1,進入第三步;若第乙個括號為右括號,不管是『)』還是『]』,就是錯誤的。因為棧頂沒有與之相匹配的左括號,此時彈出出錯提示,重新進入第一步;
3.若第二個括號為左括號,則被壓棧,急迫度為1,剛剛壓棧的左括號急迫度變為0,進入第四步;若為右括號,則檢視是否與棧頂的左括號相匹配,若匹配成功,則刪除棧頂左括號,若匹配失敗,則彈出出錯提示,重新進入第一步;
4.依次類推下去
總而言之一句話:是左括號的,壓棧,急迫度為1,是右括號的,則看其是否與棧頂的左括號相匹配,若匹配,則刪除棧頂括號,若不匹配,出錯。
//headfile
// match paren
//history
// xinspace 5 mar first release
#ifndef xinspace_
#define xinspace_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define error_show(function) \
do \
while(0)
#define max 10
void start(); //開始函式,包含在main函式內
void judge(char **st, char *sb, char pa);//判斷乙個右括號是否與棧頂的左括號匹配的函式,char **st是棧頂左括號指標的位址,sb是棧底指標,pa表示乙個右括號
char *create_stack();//建立棧
char pop(char *st, char *sb);//出棧
void push(char *st, char pa);//壓棧
#endif
2.主函式 main.c
//program
// paren match
//history
// xinspace 5 mar first release
#include 「match_pa.h」
int main(void)
fflush(null);
printf(「continue? y/n\n」);
getchar();//這個getchar函式是用來接收回車符的,這個回車符是當你在螢幕上輸入選項y或n之後敲回車的那個回車產生的。
con = getchar();//這個才是真正的選項y或n
}return 0;
}void start()
count++;
}if(st != sb) //如果出錯了,即左右括號不匹配的時候,棧中肯定還存在一些左括號沒有被匹配,即st與sb不相等,把這些括號依次出棧列印到螢幕上
putchar(10);}}
3.附加檔案match_pa.c
//program
// match paren
//history
// xinspace 5 mar first release
//#include 「match_pa.h」
char *create_stack()//建立棧
void push(char *st, char pa)//壓棧
char pop(char *st, char *sb)//出棧
return *st;
}void judge(char **st, char *sb, char pa)//判斷乙個右括號是否與棧頂的左括號匹配
}else if(pa == 『]』)
}else}
match_pa.h
main.c
match_pa.c
用棧實現括號匹配
構造棧函式並用棧實現括號匹配 以下 include include include 建立乙個棧,用棧求出二進位制轉十進位制,轉八進位制,銷毀,清空,push,pop 用棧來求逆波蘭演算法 用字元來轉成雙精度變數 用棧來檢驗括號是否正確 建立乙個鍊錶棧,並具有插入,刪除操作 define initnu...
用棧實現括號匹配 python
python資料結構與演算法分析 第二版 用python實現棧,檔名為pystack.py user bin env python coding utf 8 假設列表尾部是棧頂端o 1 class stack def init self self.items defisempty self 判棧空 ...
棧和佇列 用棧實現括號匹配
一 棧匹配 思路 借助棧來實現括號的匹配,如果碰到的是三種左括號的話,將左括號進行入棧,以為需要匹配到括號肯定都是右括號於左括號進行匹配的,所以遇到左括號直接入棧就可以了。如果遇到右括號,需要進行匹配,如果目前棧中為空的話,直接返回false,因為這個括號很明顯的多出來了。如果不為空,將棧中的乙個元...