【原理】
前缀表达式计算算法补充:(前缀计算易错在于循环变量是--i不是++i)
- 从后往前扫描表达式
- 如果遇到操作数则入栈
- 如果遇到操作符则连续出栈两个元素,进行运算,并将运算结果存入栈中
- 返回栈顶元素值
小结:前缀表达式的计算与后缀类似,唯一区别是前缀要从后往前读,且应当是先取a再取b。
【代码】
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#define maxSize 100
int Operation(int a, char op, int b)
{
if (op == '+')
return a + b;
if (op == '-')
return a - b;
if(op == '*')
return a * b;
if (op == '/')
{
if (b == 0)
{
puts("Error");
exit(0);
}
else
{
return a / b;
}
}
return -1;//如果不是以上操作符则返回异常值-1
}
int Pre(char exp[])
{
int len, i;
int stack[maxSize], top = -1;
int a, b, c;
char op;
len = strlen(exp);
i = len - 1;
while (i >= 0)
{
if (isdigit(exp[i]))
{
stack[++top] = exp[i] - '0';
}
else
{
op = exp[i];
a = stack[top--];
b = stack[top--];
c = Operation(a, op, b);
stack[++top] = c;
}
--i;
}
return stack[top];
}
int main()
{
char exp[maxSize] = "/++12*345";
int c = Pre(exp);
printf("%d", c);
return 0;
}