利用棧實現括號匹配演算法!
阿新 • • 發佈:2019-01-07
演算法:檢測表示式中的字元,若是左括號就入棧,如果是右括號就出棧一個元素與其配對,配對成功則繼續訪問下一個字元,否則退出。出現非括號字元則跳過。
#include <stdio.h> #include <malloc.h> //malloc,realloc #include <math.h> //含有overflow #include <process.h> //exit() #define S_SIZE 100 //棧的空間大小 #define STACKINCREAMENT 10//增加空間 struct SqStack{ int *base; //棧底 int *top; //棧頂 int stacksize; //棧當前的儲存空間 }; void main() {//子函式宣告 void InitStack(SqStack &S);//初始化空棧 int StackEmpty(SqStack S);//判空 void push(SqStack &S,int e);//進棧 void pop(SqStack &S,int &e);//出棧 //主函式開始 SqStack s;//初始化空棧 InitStack(s); char ch[100],*p;int e; p=ch; printf("輸一個含義有()[]{}的括號表示式:\n"); gets(ch); while(*p) { switch (*p) { case '{': case '[': case '(': push(s,*p++);break;//只要是左括號就入棧 case '}': case ']': case ')':pop(s,e); if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')')) p++; else {printf("括號不匹配!");exit(OVERFLOW);} break; default :p++;//其他字元就後移 } } if (StackEmpty(s)) printf("括號匹配成功"); else printf("缺少右括號!"); printf("\n"); } void InitStack(SqStack &S) {S.base=(int *)malloc(S_SIZE*sizeof(int)); S.stacksize=S_SIZE; S.top=S.base;//初始化空棧 } int StackEmpty(SqStack S) { if(S.base==S.top) return 1; else return 0; } void push(SqStack &S,int e) {//進棧 if(S.top-S.base>=S.stacksize) {S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int)); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREAMENT;} *(S.top)=e; S.top++; } void pop(SqStack &S,int &e) {//出棧 if(S.base!=S.top) {S.top--; e=*S.top;} }