IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 51nod3404 后缀表达式(逆波兰表达式) -> 正文阅读

[C++知识库]51nod3404 后缀表达式(逆波兰表达式)

3404 后缀表达式(逆波兰表达式)

后缀表达式是一种把运算符后置的算术表达式,例如普通的表达式2 + 3的后缀表示法为2 3 +。后缀表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的后缀表示法为?2 3 + 4 *。本题求解后缀表达式的值,其中运算符包括+ - * /四个。

计算后缀表达式,要从前向后遍历字符串。当遇见运算数时,压入栈中。当读到运算符时,将栈中的连续2个运算数弹栈;用当前运算符计算后(注意后缀表达式的先出栈的运算数,放在运算符后面;后出栈的运算数,放在运算符前面),再将结果压栈。最后的栈顶就是后缀表达式的运算结果。

输入

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出

输出为一行,表达式的值。
可使用以下语句保留固定长度的小数点后尾数
C++:cout<<setiosflags(ios::fixed)<<setprecision(6)<<ans<<endl;
C:printf("%.6lf\n", ans);

输入样例

11.0 12.0 + 24.0 35.0 + *

输出样例

1357.000000

样例解释

从前向后读入数据:
11.0: 11.0入栈? ? ? ? 12.0: 12.0入栈? ? ? ? +: 将栈顶的 12.0 11.0 弹出,将运算结果23.0压入栈内(11.0+12.0=23.0)
24.0: 24.0入栈? ? ? ? 35.0: 35.0入栈? ? ? ? +: 将栈顶的 35.0 24.0 弹出,将运算结果59.0压入栈内(24.0+35.0=59.0)
*: 将栈顶的 59.0 23.0 弹出,将运算结果1357.0压入栈内(23.0*59.0=1357.0)

解析:

波兰式符合递归结构,所以直接递归求解即可,时间复杂度O(字符的的个数)。

然后逆波兰表达式正好是波兰表达式逆过来得到式子,所以只需要先输入式子,然后从后往前递归即可,这里有两点需要注意,减的时候还要取反,除的时候要取倒数,因为递归求得是后面减前面,而正常的是前面减后面。

这里说明一下递归的过程,实际上波兰表达式是一颗二叉树,计算符号的儿子节点是数字,然后这两个数字通过父节点的计算符号计算出结果返回给上一层,最终返回给根节点得到波兰表达式的计算结果。

放代码:

#include<iostream>
#include<string>
#include<stack>
#include<cctype>
using namespace std;
string temp;
double x, a, b;
stack<double> s;
inline double cal(double a, char op, double b) {
    switch (op) {
    case '+': return a + b;
    case '-': return a - b;
    case '*': return a * b;
    case '/': return a / b;
    default : return 0;
    }
}
inline double trans(const string& s) {
    double k = 0.0, f = 1.0, frac = 1.0;
    bool flag = false;
    for(int i = 0; i < s.length(); ++i) {
        char c = s[i];
        if(c == '+') f = 1.0;
        else if(c == '-') f = -1.0;
        else if(c == '.') flag = true;
        else if(!flag) k = k * 10.0 + (c - 48);
        else frac /= 10.0, k += (c - 48) * frac;
    }
    return k * f;
}
int main() {
    while(cin >> temp) {
        if(isdigit(temp[0]) || isdigit(temp[1])) {
            x = trans(temp);
            s.push(x);
        }
        else {
            b = s.top(), s.pop();
            a = s.top(), s.pop();
            s.push(cal(a, temp[0], b));
        }
    }
    printf("%.6f", s.top());
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:08:08  更:2022-04-01 23:09:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:00:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码