堆栈的问题 报错了

tomatobin 2011-04-24 10:44:01
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 1024
typedef char datatype;

typedef struct node
{ datatype data;
struct node *next;
}StackNode,* LinkStack;

LinkStack Init_LinkStack()
{
return NULL;
}

int Empty_LinkStack(LinkStack top )
{
if(top==NULL) return 1;
else return 0;
}

void Push(LinkStack *top, datatype x) //要想对指针本身进行操作,就必须定义双重指针!
{ //*top就是双重指针
StackNode *s;
s=(StackNode *)malloc(sizeof(StackNode));
s->data=x;
s->next=*top;
*top=s;
}

datatype Pop(LinkStack * top)
{
datatype x;
StackNode *p;
if (top==NULL) {x=' ';return;}//当栈为空时,x返回空
else { x = (*top)->data;
p = *top;
*top = (*top)->next;
free (p);
}
return x;
}

int Is_Match(char s[])
{
int length=strlen(s);
LinkStack L;
L=Init_LinkStack();
int i=0;

for(i;i<length;i++)
{
char temp=' ';
if(s[i]=='(') Push(&L,s[i]);
if(')'==s[i])
{
temp=Pop(&L);
printf("%c",temp);
if(temp!='(') return 0;
}
}
return 1;
}

void main()
{
char test1[]="((1+2)*2)/3";
char test2[]="())ab";

printf("test1:%d\n",Is_Match(test1));
printf("test2:%d\n",Is_Match(test2));
}


运行到test2时就会报错,不知怎么回事
...全文
138 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomatobin 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 eye_119_eye 的回复:]

if (*top==NULL) {x=' ';return x;}//当栈为空时,x返回空
[/Quote]

就是这样的,因为是双重指针。所以*top才表示里面的内容,忘了写*,然后就不知道错在哪里了。
谢谢大家
tomatobin 2011-04-25
  • 打赏
  • 举报
回复
嗯,知道 了 谢啦
eye_119_eye 2011-04-25
  • 打赏
  • 举报
回复
if (*top==NULL) {x=' ';return x;}//当栈为空时,x返回空
wo_aidoudou 2011-04-25
  • 打赏
  • 举报
回复
我想问题大概有两个:

① if (top==NULL) {x=' ';return ?;}//当栈为空时,x返回空
你定义的pop函数返回值是int型的 这里需要有返回值 可能是你粘贴的时候漏掉了吧

②main函数中char test2[]="())ab";
而Ismatch函数有这样的判断
if(s[i]=='(') Push(&L,s[i]);
if(')'==s[i])
{
temp=Pop(&L);
printf("%c",temp);
if(temp!='(') return 0;
}
由此可见括号应该是一对一的 而你的字符串中一个左括号 两个右括号 所以造成了test2报错的结果
一曲肝肠断 2011-04-25
  • 打赏
  • 举报
回复
想说一点,解析表达式,你那个数据结构不太合适,因为你只能解析单位整数,如 0-9,
如果要解析18.23这样的,就无法满足了,
typedef struct node
{ datatype data;//这里只能放一个char
struct node *next;
}StackNode,* LinkStack;
如果定义成这样就能满足,
typedef struct node
{ datatype cdata; //存放字符
int idate; //存放数字 也可以用float, double型的,int型的只能解析整数
bool bsign;//说明符,说明存放的是数字还是操作符
struct node *next;
}StackNode,* LinkStack;
我以前做过类似的,这样的结构能满足,自己想的,不知道有没更好的方式,期待高手。。。
一曲肝肠断 2011-04-25
  • 打赏
  • 举报
回复
楼主想解析算术表达式吧!
还有这不是堆栈的问题吧,只是你写了些函数模仿堆栈操作呢,呵呵,
pengzhixi 2011-04-25
  • 打赏
  • 举报
回复
if (*top==NULL) {x=' ';return x;}//当栈为空时,x返回空
luciferisnotsatan 2011-04-25
  • 打赏
  • 举报
回复
LinkStack L;
L=Init_LinkStack(); // L可以指向NULL


temp=Pop(&L); // 但L自己的地址不可能是NULL

luciferisnotsatan 2011-04-25
  • 打赏
  • 举报
回复
temp=Pop(&L); // L的地址不可能是NULL

datatype Pop(LinkStack *  top)
{
datatype x;
StackNode *p;
if (top==NULL) {x=' ';return;} // 这里的if比较不可能为真。())第二个)出错
else { x = (*top)->data;
p = *top;
*top = (*top)->next;
free (p);
}
return x;
}




luciferisnotsatan 2011-04-25
  • 打赏
  • 举报
回复
单步调试下
AnYidan 2011-04-25
  • 打赏
  • 举报
回复
楼住首次运行,创立了stack, push 了对象(要释放satck 吗?)
第二次又Init_LinkStack ,不明白为什么?

自己跟踪一下,你的想法你最了解

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧