算法流程
对于一个后缀表达式,首先从左往右扫描每一个字符:
① 如果扫描到数字,则将数字入栈,继续扫描下一个字符。
② 如果扫描到运算符,则连续出栈两次,取出两个操作数进行运算,最后将运算的结果重新入栈。
如此往复,直到扫描到终止运算符 “\0” 停止,此时栈底元素值即为表达式的值。
代码逻辑(C语言)
详细解析请看注释
#include <iostream>
using namespace std;
#define maxSize 50
int op (int a, char Op, int b) // 运算函数,用来完成算式“a Op b”的运算
{
if(Op == '+') { return a + b; }
if(Op == '-') { return a - b; }
if(Op == '*') { return a * b; }
if(Op == '/')
{
if(b == 0) // 这里需要判断:如果除数为零,则输出错误标记
{
cout<< "ERROR" <<endl; // 打印错误信息
return 0;
}
else { return a/b; }
}
return 0; // 如果运行到这一步说明出错了
}
int com (char exp[]) // 后缀式计算函数
{
int i,a,b,c; // a、b为操作数,c来保存结果
int stack[maxSize]; // 定义并初始化栈
int top = -1; // 定义并初始化栈顶置针
char Op; // Op用来取运算符
for(i = 0; exp[i] != '\0'; i++)
{
if(exp[i] >= '0' && exp[i] <= '9') // 如果遇到操作数,则入栈等待处理
{
stack[++top] = exp[i] - '0'; // 字符型转换为整型
}
else // 如果遇到运算符,则说明前面等待处理的数字处理条件已具备,开始运算
{
Op = exp[i]; // 取运算符
b = stack[top--]; // 取第二个操作数
a = stack[top--]; // 取第一个操作数
c = op(a, Op, b); // 操作数和符号进行Op运算
stack[++top] = c; // 运算结果入栈
}
}
return stack[top];
}
int main(){
char exp[] = {'3','1','3','2','*','+','+','5','/',}; //中缀表达式:(3+1+3*2)/5 = 2
int answer = com(exp);
cout << answer << endl; // 打印结果:2
}