1. 程式人生 > >括號匹配(棧實現)

括號匹配(棧實現)

#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;   //棧當前的儲存空間
};
int main()
{//子函式宣告
void InitStack(SqStack &S);//初始化空棧 int StackEmpty(SqStack S);//判空 void push(SqStack &S,int e);//進棧 int pop(SqStack &S,int &e);//出棧 //主函式開始 while(1) { SqStack s;//初始化空棧 InitStack(s); char ch[100],*p;int e; p=ch;int flag =1; printf("輸一個含義有()[]{}的括號表示式:\n"
); gets(ch); while(*p) { switch (*p) { case '{': case '[': case '(': push(s,*p++);break;//只要是左括號就入棧 case '}': case ']': case ')':if(pop(s,e)) {exit(OVERFLOW);flag = 0;} if
((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')')) p++; else {printf("括號不匹配!");exit(OVERFLOW);} break; default :p++;//其他字元就後移 } } if (StackEmpty(s)&&flag) printf("括號匹配成功"); else if(flag) 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++; } int pop(SqStack &S,int &e) {//出棧 if(S.base!=S.top) {S.top--; e=*S.top;return 0;} else { printf("缺少左括號\n");return 1;} }