栈检验括号序列,用文件
请帮我改代码,不要只说大概,为什么打开内容为“{[()[()]]”的“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;
}









