福禄寿喜财 2019-12-17 13:53 采纳率: 0%
浏览 238

利用栈实现表达式求值,编译通过但是没有结果。

不知道哪里出了问题,希望大佬能帮忙看看,谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
//定义一个结点结构体
typedef struct node 
{
    char data;
    struct node *next;
}Snode;

void InitStack(Snode *top);
void push(Snode *top,char x);
char pop(Snode *top);
char gettop(Snode *top);
int In(char x);
char Precede(char a,char b);
char Operate(char a,char b,char z);
char EvaluaExpression(char a[]);

int main()
{
char a[MAX],result;
scanf("%s",a);
result = EvaluaExpression(a);
printf("%d\n",result-'0');
return 0;
}
//初始化空栈
void InitStack(Snode top)
{
top = (Snode
)malloc(sizeof(Snode));
top->next = NULL;
}
//压栈函数
void push(Snode top,char x)
{
Snode *p;
p = (Snode
)malloc(sizeof(Snode));
p->data = x;
p->next = NULL;
top->next = p;
}
//出栈函数
char pop(Snode top)
{
Snode *p;
if(top != NULL)
{
p = top->next;
top->next = p->next;
return p->data;
}
}
//取栈顶元素
char gettop(Snode *top)
{
Snode *p;
if(top != NULL)
{
p = top->next;
return p->data;
}
}
//判断字符是否为运算符
int In(char x)
{
int i;
switch(x)
{
case '+':
case '-':
case '
':
case '/':
case '%':
case '(':
case ')':
case '^':
case '#':
i = 1;
break;
default:
i = 0;
break;
}
return i;
}
//判定运算符栈的栈顶元素与读入的运算符之间的优先级关系
char Precede(char a,char b)
{
int i,j;
int s[9][9] =
{
{1,1,-1,-1,-1,1,-1,-1,1},
{1,1,-1,-1,-1,1,-1,-1,1},
{1,1,1,1,-1,1,1,-1,1},
{1,1,1,1,-1,1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,-1,0},
{1,1,1,1,0,1,1,1,1},
{1,1,1,1,-1,1,1,-1,1},
{1,1,1,1,-1,1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,-1,0}

};
switch(a)
{
case '+':
i = 0;
break;
case '-':
i = 1;
break;
case '*':
i = 2;
break;
case '/':
i = 3;
break;
case '(':
i = 4;
break;
case ')':
i = 5;
break;
case '%':
i = 6;
break;
case '^':
i = 7;
break;
case '#':
i = 8;
break;
}
switch(b)
{
case '+':
j = 0;
break;
case '-':
j = 1;
break;
case '*':
j = 2;
break;
case '/':
j = 3;
break;
case '(':
j = 4;
break;
case ')':
j = 5;
break;
case '%':
j = 6;
break;
case '^':
j = 7;
break;
case '#':
j = 8;
break;
}
if(s[i][j] == 1) return '>'; //当s[i][j]为1时,a的优先级高于b的优先级
else if(s[i][j] == -1) return '<'; //当s[i][j]为-1时,b的优先级高于a的优先级
else return '='; //当s[i][j]为其他值时,a的优先级与b的优先级相等
}
//进行二元运算
char Operate(char a,char b,char z)
{
int x = a-'0',y = b-'0',i;
switch(z)
{
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
case '%':
return x%y;
case '^':
for(i = 1; i<y; i++)
x*=x;
return x+'0';
}
}

char EvaluaExpression(char a[])
{
Snode* OPTR,*OPND;
InitStack(OPTR);
InitStack(OPND);
int i = 0;
char ch,m,n,theta;
push(OPTR,a[i]); //先将输入的第一个#入栈
ch = a[++i];
while(ch != '#' || gettop(OPTR) != '#')
{
if(!In(ch)) //判断ch是否为运算符字符
{
push(OPND,ch);
ch = a[++i];
}
else
switch(Precede(gettop(OPTR),ch)) //比较运算符栈栈顶元素和ch的优先级
{
case '<':
push(OPTR,ch);
ch = a[++i];
break;
case '>':
theta = pop(OPTR);
n = pop(OPND);
m = pop(OPND);
push(OPND,Operate(m,theta,n));
break;
case '=':
pop(OPTR);
ch = a[++i];
break;
}
}
return gettop(OPND);
}

  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)