1. 程式人生 > >棧應用之括號匹配

棧應用之括號匹配

此程式碼僅為棧的簡單應用,對括號匹配問題做出了描述,棧的更多用途表示式求值將在後面推出

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "string.h"
typedef int status;
typedef char SelemType;
typedef
struct{ SelemType *base; SelemType *top; int stacksize; }SqStack; status InitStack(SqStack &S){ S.base = (SelemType *)malloc(STACK_INIT_SIZE*sizeof(SelemType)); if(!S.base) exit (OVERFLOW); S.top=S.base; S.stacksize = STACK_INIT_SIZE; return OK; } status Push(SqStack &S, SelemType e){ if(S.top - S.base >= S.stacksize){ S.base = (SelemType *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof
(SelemType)); if(!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++=e; return OK; } status Pop(SqStack &S, SelemType &e){ if(S.top == S.base) return ERROR; e=*--S.top;//棧頂指標在元素後一個 return OK; } status StackEmpty(SqStack S){ if(S.top==S.base) return
TRUE; else return FALSE; } int correct(char *exp, int max){ int i, flag; char e, x; SqStack S; InitStack(S); for(i=0;i<strlen(exp); i++){ x = exp[i]; if(exp[i] =='('|| exp[i]=='['||exp[i] == '{') Push(S,x); if(x ==')'|| x==']'||x == '}') {if(!Pop(S,e)) flag=0; else if((x ==')'&&e!='(') || (x == ']' && e != '[') || (x == '}' && e != '{')) flag = 0; } } if(S.top!=S.base) flag = 0; return flag; } void main(){ char exp[100]; while(1){ printf("請輸入表示式,輸出0退出:"); gets(exp); if(strcmp(exp, "0") == 0) break; if(correct(exp, strlen(exp)) == 0) printf("內容表達式為:\n%s\n表示式括號不匹配\n", exp); else printf("表示式括號匹配!\n"); } }