小弟写了个符号配对的程序出了点问题,哪位高手指点下
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct
{
char *base;
char *top;
}stack;
InitStact(stack &s)
{
s.base=(char*)malloc(100*sizeof(char));
if(!s.base) return 0;
s.top=s.base;
return 1;
}
int StackEmpty(stack s)
{
if(s.top==s.base)
return 1;
else
return 0;
}
gettop(stack s,char &e)
{
if(s.top==s.base) return 0;
e=*(s.top-1);
return 1;
}
push(stack &s,char e)
{
*s.top++=e;
return 1;
}
pop(stack &s,char &e)
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}
void check(stack &s,char &data)
{
char e;
switch(data)
{
case '(':
push(s,data);break;
case '[':
push(s,data);break;
case '{':
push(s,data);break;
case ')':
gettop(s,e);
if(e=='('&&!StackEmpty(s)) pop(s,e);
break;
case '}':
gettop(s,e);
if(e=='{'&&!StackEmpty(s))pop(s,e);
break;
case ']':
gettop(s,e);
if(e=='['&&!StackEmpty(s))pop(s,e);
break;
//default :
//printf("你的输入不合法!\n");
}
}
void main()
{
stack s;
InitStact(s);
intN,under,underer,M;
char **p;
printf("你想输入几组数据?每个数据的个数:");
scanf("%d%d",&N,&M);
p=(char **)malloc(N*sizeof(char *));
for(int i=0;i<N;i++)
p[i]=(char *)malloc(M*sizeof(char));
printf("输入你的符号:");
for(under=0;under<N;under++)
{
for(underer=0;underer<M;underer++)
{
scanf("%c",&p[under][underer]);
}
}
for(under=0;under<N;under++)
{
for(underer=0;underer<M;underer++)
check(s,p[under][underer]);
if(StackEmpty(s))
printf("配对正确!\n");
else
printf("符号不配对!\n");
}
getchar();
}
[解决办法]
使用栈来实现括号平衡很有效的,而且很简单
[解决办法]
stack s;InitStact(s);//改为:InitStact(&s);
传递的应为s的地址;
应该对N,M值的合法性和malloc返回值进行判断
数组和栈分配的内存空间都没有进行回收,内存泄漏;
check里面就不用再调用StackEmpty(s)了吧,能够取得e肯定栈非空;或者是当前符号为右括号而栈为空时直接输出非法;
呵呵,不知怎么样?
[解决办法]