C++后缀表达式计算器

目的:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如: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中 。
如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值