一、问题陈述
从键盘上输入一算术表达式(中缀白大师),包括圆括号,计算出表达式的值。 要求:
程序对所输入的表达式作简单判断,如有错给出提示;实现算术四则运算(+、-、*、/)和平方(^)运算,能处理双目运算符:+和-;能将中缀算术表达式转换成后缀表达式并输出,并输出运算结果。
二、概要设计
2.1 概要简述
中缀表达式转为后缀表达式,从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。 后缀表达式也称为逆波兰表达式,计算方法为:新建一个表达式,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
2.2 存储结构表示
typedef struct {//数字栈结构体
double data[MAXSIZE];
int top;
} opstack;
typedef struct {//符号栈结构体
char data[MAXSIZE];
int top;
} stack;
2.3 详细设计
2.3.1 判断中缀表达式是否合理
//判断中缀表达式是否合理
bool judge_infix(char str[]){
int temp=0;
if(str[0]=='/'||str[0]=='*')
return false;
if(str[strlen(str)-1]'9')
return false;
for(int i=0; i='0'&&str[i-1]='0'&&str[i+1]='0'&&ch='0'&&a[i]top=0;
}
//取栈头
int GetTop(stack s, char *e) {
if(s.toptopdata[--s->top];
}
//入栈操作
void Push(stack *s, char e) {
if(s->top>=MAXSIZE)
printf("栈满!");
else
s->data[s->top++]=e;
}
//判断栈空
int StackEmpty(stack s) {
if(s.top==0)
return 1;
else return 0;
}
//计算表达式值
double ComputeExpress(char a[]) {
opstack s;
int i=0, value;
float x1, x2, result;
s.top=-1;
while (a[i]!='\0') {
if(a[i]!=' '&&a[i]>='0'&&a[i]='0'&&ch |