# 中缀表达式求值及中缀表达式到后缀表达式的转换

## 利用栈中缀表达式求值

#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}Sqstack;
Status Initstack(Sqstack &S)
{
S.base=new SElemType[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
Status emptystack(Sqstack S)
{
if(S.top==S.base)
return 1;
else return 0;
}
Status push(Sqstack &S,SElemType e)
{
if(S.top-S.base==S.stacksize)  return ERROR;
*S.top++=e;
return OK;
}
Status Pop(Sqstack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
Status GetTop(Sqstack S)//),SElemType &e)
{
if(S.top!=S.base)
return *(S.top-1);
}
const char oper[7] = { '+', '-', '*', '/', '(', ')', '#' };
bool In(char ch) {//判断ch是否为运算符
int i;
for ( i = 0; i < 7; i++) {
if (ch == oper[i]) {
return true;
}
}
return false;
}
char Precede(char theta1, char theta2) {//判断运算符优先级
if ((theta1 == '(' && theta2 == ')') || (theta1 == '#' && theta2 == '#')) {
return '=';
} else if (theta1 == '(' || theta1 == '#' || theta2 == '(' || (theta1
== '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/')) {
return '<';
} else
return '>';
}
char Operate(char first, char theta, char second) {//计算两数运算结果
switch (theta) {
case '+':
return (first - '0') + (second - '0') + 48;
case '-':
return (first - '0') - (second - '0') + 48;
case '*':
return (first - '0') * (second - '0') + 48;
case '/':
return (first - '0') / (second - '0') + 48;
}
return 0;
}



#include<stdio.h>
typedef int Status;
typedef char SElemType;
#include"Sqstack.h"
char EvaluateExpression()
{
Sqstack OPND;
Sqstack OPTR;
Initstack(OPND);
Initstack(OPTR);
char ch,theta,a,b,x;
push(OPTR, '#');
printf("请输入要求的表达式");
ch=getchar();
while (ch!='#'||GetTop(OPTR)!='#')
{
if (!In(ch)) { push(OPND,ch); ch=getchar(); }
else
switch (Precede(GetTop(OPTR),ch))
{
case '<':
push(OPTR, ch); ch=getchar();
break;
case '>':
Pop(OPTR,theta);
Pop(OPND, b); Pop(OPND,a);
push(OPND,Operate(a,theta,b));
break;
case '=':
Pop(OPTR, x); ch=getchar();
break;
}
}
return GetTop(OPND);
}
int main(){
char a;
a=EvaluateExpression();
printf("%c",a);
return 0;
}



## 中缀表达式到后缀表达式的转换

1.遇到操作数，直接输出；
2.栈为空时，遇到运算符，入栈；
3.遇到左括号，将其入栈；
4.遇到右括号，执行出栈操作，并将出栈的元素输出，直到弹出栈的是左括号，左括号不输出；
5.遇到其他运算符’+”-”
”/’时，弹出所有优先级大于或等于该运算符的栈顶元素，然后将该运算符入栈；
6.最终将栈中的元素依次出栈，输出。

11-12
03-27 2059

04-21 2万+
12-02 1万+
10-05 1296
09-09 15万+
04-17 6424
09-20 10万+
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客