[急]用栈检验括号序列(文件操作)
不知道代码错在哪里?我都自己看代码试了半天,不知道错在哪。
如“{[()[()]]”保存在a.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=0;
}
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; /* 左括号入栈,且p++ */
case '}':
case ')':
case ']':if(!StackEmpty(s)) /* 栈不空 */
{
Pop(s,e); /* 弹出栈顶元素 */
if(*p==')'&&e!='('||*p==']'&&e!='['||*p=='}'&&e!='{') /* 弹出的栈顶元素与*p不配对 */
{printf("%c ",*p);
printf("左右括号不配对!\n");
exit(-1);
}
else
{
p++;
printf("%c",*p);
break; /* 跳出switch语句 */
}
}
else /* 栈空 */
{
printf("缺乏左括号\n");
exit(-1);
}
default: p++; /* 其它字符不处理,指针向后移 */
}
}
if(StackEmpty(s)) /* 字符串结束时栈空 */
printf("括号匹配\n");
else
printf("缺乏右括号\n");
return 0;
}
fclose(fp);
//这个丢到函数结尾看看
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACK_GROW_SIZE 5
#define ELEMTYPE char
#define OK 1
#define ERROR 0
typedef struct { /*建立一个栈的首结点*/
ELEMTYPE * base;
ELEMTYPE * top;
int stacksize;
} SpStack;
int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
if (!s->base) return ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int StackEmpty(SpStack *s) { /*判断栈是否为空*/
if (s->top==s->base) return OK;
else return ERROR;
}
int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
if (!s->base) return ERROR;
s->stacksize+=STACK_GROW_SIZE;
s->top=s->base+s->stacksize;
}
*s->top++=e;
return OK;
}
int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
if (StackEmpty(s)) return ERROR;
*e=*(--s->top);
return OK;
}
int Comp(ELEMTYPE a,ELEMTYPE b) {
if ((a=='('&&b!=')')
[解决办法]
(a=='['&&b!=']')
[解决办法]
(a=='{'&&b!='}')) {
return ERROR;
} else return OK;
}
int Count(SpStack *s) {
ELEMTYPE e[STACK_INIT_SIZE*2];
ELEMTYPE e1;
int i;
InitStack(s);
fgets(e,STACK_INIT_SIZE*2,stdin);
if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;
printf("%s\n",e);
for (i=0;e[i]!='\0';i++) {
switch (e[i]) {
case '(':
case '[':
case '{':
Push(s,e[i]);
break;
case ')':
case ']':
case '}':
if (StackEmpty(s)) {
printf("%*s↖右括号多余\n",i+1,"");
return(ERROR);
} else Pop(s,&e1);
if (!Comp(e1,e[i])) {
printf("%*s↖左右匹配出错\n",i+1,"");
return(ERROR);
}
}
}
if (!StackEmpty(s)) {
printf("%*s↖左括号多余\n",i,"");
return(ERROR);
} else {
printf("匹配正确\n");
return(OK);
}
}
void main() {
SpStack s;
Count(&s);
free(s.base);
}