栈检验括号序列,用文件
请帮我改代码,不要只说大概,为什么打开内容为“{[()[()]]”的“xxx.txt”文件,程序显示“括号不匹配!”,应该为“缺乏右括号啊”程序代码:
#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { char *top; char *base; int stacksize; }Stack; void Push(Stack &s,char c) { if((s.top-s.base)>=s.stacksize) s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); if(!s.base) exit(0); s.top=s.base+s.stacksize; s.stacksize+=INCREMENT; *s.top++=c; } void Pop(Stack &s,char &c) { if(s.top==s.base) exit(0); c=*--s.top; } int StackEmpty(Stack s) { if(s.top==s.base) return 1; else return 0; } void InitStack(Stack &a) { a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); if(!a.base) { printf("分配空间失败!\n"); exit(-1); } a.top=a.base; a.stacksize=INITSTACKSIZE; } int main() { FILE *fp; Stack s; char a[100],b[100],e; char *p; printf("请输入您要读取的文件名:\n"); gets(a); fp=fopen(a,"r"); if(fp==NULL) { printf("打开文件失败!\n"); exit(0); } else { printf("文件打开成功!\n"); } fscanf(fp,"%s",b); fclose(fp); puts(b); InitStack(s); p=b; while(*p) // 没到串尾 switch(*p) { case '(': case '[': case '{':Push(s,*p++); // 左括号入栈,且p++ break; case ')': case ']': case '}':if(!StackEmpty(s)) // 栈不空 { Pop(s,e); // 弹出栈顶元素 if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}')) { // 出现3种匹配情况之外的情况 printf("左右括号不配对\n"); exit(0); } } else // 栈空 { printf("缺乏左括号\n"); exit(0); } default: p++; // 其它字符不处理,指针向后移 } if(StackEmpty(s)) // 字符串结束时栈空 printf("括号匹配\n"); else printf("缺乏右括号\n"); return 0; }