用棧實現括號匹配

2021-06-13 10:59:16 字數 2603 閱讀 4989

假設只允許出現兩種括號:圓括號和方括號,其巢狀順序隨意,即不管[()]或[()]等都為正確匹配,但是形如([)就成為錯誤的匹配。

可以用「期待的緊急程度」的概念來描述:

如 [()] 共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,因為這個括號很明顯的多出來了。如果不為空,將棧中的乙個元...