目的:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:2 1 + 3 *,即(2 + 1) * 3. 通过本课程设计,应使学生掌握后缀表达式的特点、栈的基本方法和基本原理,培养学生运用语言编程及调试的能力,运用数据结构解决简单的实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。
要求:实现一个简单的后缀表达式计算器。假定表达式里的基本数值为实数,可用的运算符包括+,-,*,/,^,其中的 ^ 表示求幂运算。
1) 假定输入表达式里的数和运算符之间都有空格,这样可以简化输入的处理;
2) 输入的算术表达式以分号为结束符。计算器应该能输入并计算一系列表达式,遇到一行的第一个字符就是分号时程序结束。
3)上题的计算器增加一元函数功能,允许表达式里写sin, cos, tan, log(自然对数)等函数,还可以考虑加入自定义的其他数学函数。
#include <iostream>
#include <stack>
#include<string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
double evalpostfix()
{
stack<double> s;
string token;
double a, b, result;
cin >> token;
while (token[0] != ';')
{
result = atof(token.c_str());
if (result != 0.0)
s.push(result);
else if (token == "0.0")
s.push(result);
else {
if (token == "sin") {
a = s.top();
s.pop();
s.push(sin(a));
}
else if (token == "cos") {
a = s.top();
s.pop();
s.push(cos(a));
}
else if (token == "tan") {
a = s.top();
s.pop();
s.push(tan(a));
}
else if (token == "log") {
a = s.top();
s.pop();
b = s.top();
s.pop();
s.push(log(a)/log(b));
}
else {
switch (token[0])
{
case '+':
a = s.top();
s.pop();
b = s.top();
s.pop();
s.push(a + b);
break;
case '-':
a = s.top();
s.pop();
b = s.top();
s.pop();
s.push(a - b);
break;
case '*':
a = s.top();
s.pop();
b = s.top();
s.pop();
s.push(a*b);
break;
case '/':
a = s.top();
s.pop();
b = s.top();
s.pop();
s.push(a / b);
break;
case '^':
a = s.top();
s.pop();
b = s.top();
s.pop();
s.push(exp(a*log(b)));
break;
}
}
}
cin >> token;
}
return s.top();
}
int main()
{
cout<<evalpostfix();
system("pause");
return 0;
}
/*建立一个栈S 。从左到右读后缀表达式,如果读到操作数就将它压入栈S中,
如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作符运算
,再将运算的结果代替原栈顶的n项,压入栈S中 。
如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束*/