这个程序哪里错了啊,求大神指点一下

huster_yjt 2013-05-10 06:40:47
#include<stdio.h>
#include<stdlib.h>

//运算符栈
typedef struct node
{
char data;
struct node *next;
}LinkStackNode,*LinkStack;

//运算数栈
typedef struct Node
{
int data;
struct Node *next;
}LinkNode,*Link;

//初始化
void InitStack_op(LinkStack *top)
{
*top = (LinkStack)malloc(sizeof(LinkStackNode));
(*top)->next = NULL;
}
void InitStack_ov(Link *top)
{
*top = (Link)malloc(sizeof(LinkNode));
(*top)->next = NULL;
}
// 进栈
int Push_op(LinkStack top,char x)
{
LinkStackNode * temp;
temp = (LinkStackNode *)malloc(sizeof(LinkStackNode));
if(temp == NULL)
return 0;
temp->data = x;
temp->next = top->next;
top->next = temp;
return 1;
}

int Push_ov(Link top,int x)
{
LinkNode *temp;
temp = (LinkNode *)malloc(sizeof(LinkNode));
if(temp == NULL)
return 0;
temp->data = x;
temp->next = top->next;
top->next = temp;
return 1;
}
//出栈
int Pop_op(LinkStack top, char *x)
{
LinkStackNode * temp;
temp = top->next;
if(temp == NULL)
return 0;
top->next = temp->next;
*x = temp->data;
free(temp);
return 1;
}
int Pop_ov(Link top, int *x)
{
LinkNode * temp;
temp = top->next;
if(temp ==NULL)
return 0;
top->next = temp->next;
*x = temp->data;
free(temp);
return 1;
}
//判断输入字符是否为运算符
int In(char x)
{
if(x == '+' || x == '-' || x == '*' || x == '/' || x == '#' || x == '(' || x ==')')
return 1;
return 0;
}
//获取栈顶元素
char GetTop_op(LinkStack top)
{
return top->next->data;
}
int GetTop_ov(Link top)
{
return top->next->data;
}
//运算操作
int Execute(int a, char op,int b)
{
int i = 0;
switch(op)
{
case '+':
i = a + b;
break;
case '-':
i = a - b;
break;
case '*':
i = a * b;
break;
case '/':
if(b == 0)
{
printf("错误,除数不能为0!\n");
break;
}
i = a / b;
default:
break;
}
return i;
}
//字符转化为数字
int GetNumber(char &ch)
{
return atoi(&ch);
}
//比较栈顶运算符的优先级

char Compare(char s,char c)
{
switch(s)
{
case '+':
case '-':
{
if(c=='+'||c=='-')
return '>';
else if (c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')
return '>';
else
return '>';
}
break;
case '*':
case '/':
{
if(c=='+'||c=='-')
return '>';
else if (c=='*'||c=='/')
return '>';
else if(c=='(')
return '<';
else if(c==')')
return '>';
else
return '>';
}
break;
case '(':
{
if(c==')')
return '=';
else
return '<';
}
break;
case ')':
return '>';
break;
}
}

int main(void)
{
LinkStack OPTR;
Link OVS;
InitStack_op(&OPTR);
InitStack_ov(&OVS);
char ch,op;
int a,b,v,n;
Push_op(OPTR,'#');
printf("\n请输入一个表达式串(以 # 结尾):");
ch = getchar();
while(ch != '#' || GetTop_op(OPTR) != '#')
{
if(!In(ch))
{
n = GetNumber(ch);
Push_ov(OVS,n);
}
else
switch(Compare(GetTop_op(OPTR),ch))
{
case '<':
Push_op(OPTR,ch);
ch = getchar();
break;
case '>':
Pop_ov(OVS, &b);
Pop_ov(OVS, &a);
Pop_op(OPTR,&op);
v = Execute(a,op,b);
Push_ov(OVS,v);
break;
case '=':
Pop_ov(OVS, &b);
Pop_ov(OVS, &a);
Pop_op(OPTR,&op);
v = Execute(a,op,b);
Push_ov(OVS,v);
break;
}
}
v = GetTop_ov(OVS);
printf("结果为:\n",v);
return 0;
}
...全文
180 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AndyStevens 2013-05-11
  • 打赏
  • 举报
回复
初步浏览了下代码,错误百出啊
hugett 2013-05-11
  • 打赏
  • 举报
回复
学编程不能懒。。不能什么都想靠别人。。调试也是一种基本的能力。。
huster_yjt 2013-05-10
  • 打赏
  • 举报
回复
引用 2 楼 AnYidan 的回复:
[quote=引用 1 楼 lile1234_show 的回复:] 这个,自己加断点,步步调试跟踪吧
求人不如求己[/quote]很费时间啊,有些高手一看就知道何必花那么多时间呢
huster_yjt 2013-05-10
  • 打赏
  • 举报
回复
引用 1 楼 lile1234_show 的回复:
这个,自己加断点,步步调试跟踪吧
调试了几个小时了,发现是字符不能直接赋值,用strcpy之后还是不能有想要的结果
AnYidan 2013-05-10
  • 打赏
  • 举报
回复
引用 1 楼 lile1234_show 的回复:
这个,自己加断点,步步调试跟踪吧
求人不如求己
lee_鹿游原 2013-05-10
  • 打赏
  • 举报
回复
这个,自己加断点,步步调试跟踪吧

70,020

社区成员

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

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