福禄寿喜财 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条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员