用棧判斷輸入的括號是否匹配
阿新 • • 發佈:2019-01-09
棧是一種很重要的資料結構,用棧我們可以做很多事情,下面簡單介紹一種用棧來判斷使用者輸入的括號{}()[]是否匹配的演算法。
演算法簡介:
使用者輸入的括號只有成對出現且符合一般的書寫規範才算合法,比如[{( )}], {( )( )}[ ]都算合法,[( ]), []( }的不算合法。因此我們可以依次讀入使用者輸入的字串,把出現的'(' '{' '['壓入棧中,讀到')' '}' 或']'時棧頂元素出棧和它比較,並移動棧頂位置-1,如果匹配則繼續,不匹配返回0,如果都匹配,棧最後應該是空的。
因為棧底不會移動,我們構造一個順序棧,包含棧頂指標,棧底指標和棧的最大空間(判斷棧是否滿)可以滿足我們的要求。
C語言程式碼:
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define MAX_SIZE 100 typedef int status; typedef char Eletype; typedef struct stack { Eletype *top; Eletype *base; int stacksize; }stack, *pstack; void initStack(pstack); status pop(pstack); status push(pstack, Eletype); status isEmpty(pstack); status isFull(pstack); status march(pstack, Eletype*); Eletype getTop(pstack); int main(void) { stack st; pstack sp; char str[100]; sp = &st; gets(str); initStack(sp); if ( !march(sp, str) ) printf("此表示式括號不匹配!\n"); else printf("表示式合法!\n"); return 0; } void initStack(pstack sp) { sp->base = (Eletype*)malloc( sizeof(Eletype)*MAX_SIZE ); if (!sp->base) exit(-1); sp->top = sp->base; sp->stacksize = MAX_SIZE; } status pop(pstack sp) { if ( isEmpty(sp) ) return ERROR; sp->top--; return OK; } Eletype getTop(pstack sp) { return *(sp->top-1); } status push(pstack sp, Eletype m) { if ( isFull(sp) ) return ERROR; *sp->top = m; sp->top++; return OK; } status isEmpty(pstack sp) { if (sp->base == sp->top) return OK; return ERROR; } status isFull(pstack sp) { return sp->top-sp->base+1 == MAX_SIZE; } status march(pstack ps, Eletype* str) { int i = 0; int flag = 0; char comp; for (i; str[i]!='\0'; i++) { switch (str[i]){ case '[': push(ps, str[i]); break; case '(': push(ps, str[i]); break; case '{': push(ps, str[i]); break; case '}': comp = getTop(ps); pop(ps); if(comp != '{') flag=1; break; case ')': comp = getTop(ps); pop(ps); if(comp != '(') flag=1; break; case ']': comp = getTop(ps); pop(ps); if(comp != '[') flag=1; break; default: break; } if (flag == 1) return 0; } if (isEmpty(ps)) return 1; return 0; }