BooM* 2021-10-16 15:05 采纳率: 100%
浏览 38
已结题

数据结构表达式求值不能输出

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0

typedef double DataType;
typedef struct
{
DataType data[MAXSIZE];
int top;
} Sqstack;

int Initstack(Sqstack &S)
{
S.top=-1;
return OK;
}

int StackEmpty(Sqstack S)
{
return (S.top=-1?TURE:FALSE);
}

int StackFull(Sqstack S)
{
return (S.top==MAXSIZE-1?TURE:FALSE);
}

int Push(Sqstack &S,DataType e)
{
if(StackFull(S))
return ERROR;
S.top++;
S.data[S.top]=e;
return OK;
}

int Pop(Sqstack &S,DataType &e)
{
if(StackEmpty(S))
return ERROR;
e=S.data[S.top];
S.top--;
return OK;
}

float GetTop(Sqstack S)
{
DataType e;
if(StackEmpty(S))
return ERROR;
e=S.data[S.top];
return e;
}

char Precede (char a,char b)
{
char z;
if((b=='+')||(b=='-')||(b=='')||(b=='/')|| (b=='(')||(b==')') ||(b=='='))
switch (a)
{case '+':
case '-':
if((b=='
')||(b=='/')||(b=='(')) z='<';
else z='>'; break;
case '*':
case '/':
if(b=='(') z='<';
else z='>';break;
case '(':
if(b=='=') z='E';
else if(b==')')z='=';
else z='<';
break;
case ')':
if(b=='(') z='E';
else z='>'; break;
case '=':
if(b=='=')z='=';
else if(b==')') z='E';
else z='<';break;
}
else z='E';
return(z);
}

int In(char ch)
{
int i,flag=0;
char op[7]={'+','-','*','/','(',')','='};
for (i=0;i<7;i++)
if(ch==op[i])
{
flag=1;
break;
}
return flag;
}

DataType Operate(DataType a,char theta,DataType b)
{ DataType z;
switch (theta)
{
case '+':z=a+b;break;
case '-':z=a-b;break;
case '':z=ab;break;
case '/':z=a/b;break;
}
return(z);
}

float CalculateExpression(char *expr)
{
Sqstack optr,opnd;
DataType a,b,theta,x,sum;
char *p;
int count;

Initstack(optr);
Push(optr, '=');
Initstack(opnd);
p=expr;
while(*p!='='||GetTop(optr)!='=')
{
if(!In(*p))
{
sum=0;
count=0;

while(*p>='0'&&*p<='9'||*p=='.')
{
if(*p!='.')
sum=sum*10+*p-'0';
if(*p=='.'||count>0)
count++;
p++;
}
if(count>0)
sum=sum/pow(10,count-1);
Push(opnd,sum);

}
else
switch(Precede(GetTop(optr),*p))
{ case '<' :
Push(optr,*p);
p++;
break;
case '=' :
Pop(optr,x);
p++;
break;
case '>':
Pop(optr,theta);
Pop(opnd,b);Pop(opnd,a);
Push(opnd,Operate(a,theta,b));
break;
case 'E':printf("表达式中括号不匹配!");
exit(1);
}
}
return GetTop(opnd);
}

int xj(char *expr)
{
char *p;
int flag=1;

p=expr;
while(*p!='\0')
p++;
p--;
if(*p!='=')
{
    printf("表达式应以等号结束\n"); 
    return 0;
}

p=expr;
while(*p!='\0')
{
    if(*p>='0'&&*p<='9'||*p=='.'||In(*p))
    {
        p++;    
    }
    else 
    {
        printf("表达式中存在非法字符\n");
        return 0;
    }
}
return flag;

}

int main()
{
char str[81];
printf("Inpt an expression :");
scanf("%s",str);
if(xj(str))
{
printf("%s%f\n",str,CalculateExpression(str));
}
return 0;

img


(按下回车就没反应了)

img


(查错函数可以使用)

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2021-10-16 15:13
    关注

    用代码块格式化一下代码吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月24日
  • 已采纳回答 10月16日
  • 修改了问题 10月16日
  • 修改了问题 10月16日
  • 展开全部

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法