1.什么是逆波兰表达式?
2.如何实现它?
代码如下:
#include <iostream>
#include <stack>
using namespace std;
enum OPERATER //枚举数据及运算方式
{
DATA,
ADD,
SUB,
MUL,
DIV
};
struct Cell //存储数据及操作
{
OPERATER op;
int data;
};
int CalaRPN(Cell cell[], size_t size)
{
stack<int> s; //将数字压栈或出栈进行运算
size_t idx = 0;
for (idx = 0; idx < size; ++idx)
{
if (cell[idx].op == DATA)
{
s.push(cell[idx].data);//将数字入栈
}
else
{
int right = s.top(); //栈顶存放右操作数
s.pop();//将右操作数出栈
int left = s.top();//此时的栈顶元素作为左操作数
s.pop();//将左操作数出栈
switch (cell[idx].op)
{
case ADD:
s.push(left + right);
break;
case SUB:
s.push(left - right);
break;
case MUL:
s.push(left * right);
break;
case DIV:
s.push(left / right);
break;
default:
break;
}
}
}
return s.top();//此时栈顶元素为计算结果
}
int main()
{
//计算 12*(3+4)-6+8/2 ==> 12 3 4 + * 6 - 8 2 / +
Cell cell[] = {
{DATA,12},
{DATA,3},
{DATA,4},
{ADD,0},
{MUL,0},
{DATA,6},
{SUB,0},
{DATA,8},
{DATA,2},
{DIV,0},
{ADD,0}
};
cout << CalaRPN(cell, sizeof(cell) / sizeof(cell[0])) << endl; //82
return 0;
}
3.拓展—如何将中缀表达式转换为后缀表达式?
方法如下: