首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小弟写了个符号配对的程序出了点有关问题,谁指点下

2012-03-09 
小弟写了个符号配对的程序出了点问题,哪位高手指点下#include stdio.h#include malloc.h#include std

小弟写了个符号配对的程序出了点问题,哪位高手指点下
#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肯定栈非空;或者是当前符号为右括号而栈为空时直接输出非法;
呵呵,不知怎么样?
[解决办法]

探讨
再问一个问题
是不是给数组开辟的空间必须用完?

热点排行