逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
通过后缀表达式计算表达式值的过程:顺序访问表达式的每一项,若该项为操作数,则将其压入栈中;若该项是操作符<op>,则连续从栈中退出两个操作数X和Y,形成运算指令X<op>Y,将其结果重新压入栈中。当表达式的每一项都访问并处理,则其计算结果就是当前栈顶存放的值。
下面我们以表达式4+3*4+3*(1+5)———>434*+315+*+
源程序:
#pragma once
#include<iostream>
#include<assert.h>
#include<stack>
using namespace std;
enum Type
{
OP_NUM,
OP_SYMBOL,
};
enum SYMBOL
{
ADD,
SUB,
MUL,
DIV,
};
struct Cell
{
Type _type;
int _value;
};
double CountRNP(Cell *a, size_t size)
{
assert(a);
stack<double> s;
double right = 0;
double left = 0;
for (size_t i = 0; i < size; i++)
{
if (a[i]._type == OP_NUM)
{
s.push(a[i]._value);
}
else
{
if (s.empty())
{
return 0;
}
right = s.top();
if (s.empty())
{
return 0;
}
s.pop();
left = s.top();
s.pop();
switch (a[i]._value)
{
case ADD:
s.push(left + right);
break;
case SUB:
s.push(left - right);
break;
case MUL:
s.push(left * right);
break;
case DIV:
if (left== 0)
{
cout << "error" << endl;
}
else
{
s.push(right / left);
}
break;
}
}
}
return s.top();
}
测试代码:
#include"calculate.h"
int main()
{
Cell a[] = { { OP_NUM, 4 }, { OP_NUM, 3 }, { OP_NUM, 4 },
{ OP_SYMBOL, MUL }, { OP_SYMBOL, ADD }, { OP_NUM, 3 }, { OP_NUM, 1 }
, { OP_NUM, 5 }, { OP_SYMBOL, ADD }, { OP_SYMBOL, MUL }, { OP_SYMBOL, ADD } };
size_t size = sizeof(a) / sizeof(a[0]);
cout << CountRNP(a, size) << endl;
system("pause");
return 0;
}
结果:
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。