#include<stdio.h> #include<stdlib.h> #include<string.h> #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACK_INCREMENT 10 //存储空间分配增量 typedef char ElemType; typedef struct { ElemType *base; //栈底指针 ElemType *top; //栈首指针 int stacksize; //栈大小 }Stack; void MallocError() { printf("内存分配失败!/n"); exit(0); } //MallocError int InitStack(Stack *s) { s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!s->base) MallocError(); //内存分配失败 s->top=s->base; s->stacksize=STACK_INIT_SIZE; return 1; } //InitStack int Push(Stack *s,ElemType e) { if(s->top-s->base >= s->stacksize) //当空间不足时重新分配空间 { s->base=(ElemType *)realloc(s->base,(s->stacksize+STACK_INCREMENT)*sizeof(ElemType)); if(!s->base) MallocError(); //内存分配失败 s->top=s->base+s->stacksize; s->stacksize+=STACK_INCREMENT; } //if *(s->top)=e; s->top++; return 1; } //Push int Pop(Stack *s,ElemType *e) { if(s->top==s->base) return 0; *e=*(s->top-1); s->top--; return 1; } //Pop int CheckExpression(Stack *s,ElemType *str) { int i; InitStack(s); //初始化栈 for(i=0; i<strlen(str); i++) { if(str[i]!='(' && str[i]!='[' && str[i]!=')' && str[i]!=']') { printf("未知符号!/n"); return 0; } if(str[strlen(str)-1]!=')' && str[strlen(str)-1]!=']') { printf("最后输入不是右括号!/n"); return 0; } if(str[i]=='(' || str[i]=='[') //如果为左括号就压栈 Push(s,str[i]); else //如果为右括号则取出栈首元素与当前右括号比较 { ElemType popElem; if(!Pop(s,&popElem)) //栈为空 { printf("多余的右括号!/n"); return 0; } //if switch(popElem) { case '(': { if(str[i]!=')') { printf("第%d个括号匹配错误!,错误符号为%c/n",i+1,str[i]); return 0; } //if } break; case '[': { if(str[i]!=']') { printf("第%d个括号匹配错误!,错误符号为%c/n",i+1,str[i]); return 0; } //if } break; default: printf("未知符号!/n"); return 0; break; } //switch } //else } //for if(s->top!=s->base) //左括号多余右括号 { printf("缺少右括号!/n"); return 0; } return 1; } //CheckExpression int main(void) { ElemType str[100]; Stack s; while(1) { printf("请输入括号表达式:"); scanf("%s",str); if(CheckExpression(&s,str)) printf("匹配成功!/n"); } //while }