1. 程式人生 > >c語言棧實現括號匹配

c語言棧實現括號匹配

在文書處理軟體或編譯程式設計時,常常需要檢查一個字串或一個表示式中的括號是否相匹配?
匹配思想:從左至右掃描一個字串(或表示式),則每個右括號將與最近遇到的那個左括號相匹配。則可以在從左至右掃描過程中把所遇到的左括號存放到堆疊中。每當遇到一個右括號時,就將它與棧頂的左括號(如果存在)相匹配,同時從棧頂刪除該左括號。
演算法思想:設定一個棧,當讀到左括號時,左括號進棧。當讀到右括號時,則從棧中彈出一個元素,與讀到的左括號進行匹配,若匹配成功,繼續讀入;否則匹配失敗,返回FLASE。另外,在演算法的開始和結束時,棧都應該是空的.所以匹配到最後還要判斷棧是否為空,若非空,則說明匹配失敗.

程式碼實現:
採用前面的順序棧結構來實現此題.

#include"sp_stack.c"


/* 輸入括號匹配,其他字元不匹配
 * 以空格結束輸入
 * 匹配錯誤時直接退出
 * 匹配成功,返回true
 * 否則返回false
*/

int match(char input[])
{
    char ch;
    char *str;
    int result,i = 0;
    scanf("%c",&ch);
    /* 建立一個空棧 */
    sp_stack s = (sp_stack)malloc(sizeof(stack));
    s = stack_init(s);
    while(ch != ' '
) { input[i++] = ch; /* 判斷輸入字元是否為括號{}, (), [] */ if ( (ch == '{') || (ch == '(') || (ch == '[')) { push(s, ch); get_top(s, str); } if (ch == '}' || ch == ']' || ch == ')') { pop(s, str); if (*str == ch) { result = true
; scanf("%c", &ch); continue; } else return false; } scanf("%c", &ch); } if (stack_length(s) > 0) result = false; stack_destory(s); return result; } int main() { int i = 0; char input[100] = {'0'}; if(match(input) == true) { printf("匹配成功\n"); } else printf("匹配失敗\n"); printf("輸入的字串為:\n"); for (i = 0; i < 100; i ++) { if(input[i]) { printf("%c", input[i]); } } printf("\n"); return 0; }