前缀表达式

前缀表达式是一种数学表达式的表示方法,其中运算符位于操作数之前 。它也被称为波兰表达式(Polish Notation),例如:+ 5 4 变成中缀表达式是 5 + 4,* + 2 3 4 变成中缀表达式是 4 * (2 + 3)。

前缀表达式求值的方式和后缀表达式十分类似,前缀表达式可以和后缀表达式互相转换。

从右向左遍历前缀表达式 如果是数字就压栈,是空格就跳过,是符号就弹出栈顶的两个数,对这两个数进行运算,把结果压入栈中就可以了。


例如 + 5 4,4 压栈,空格跳过,5压栈,空格跳过,+号,就将5、4出栈,将5 + 4 的结果压栈,所以结果是9。

题目:波兰表达式

【题目描述】

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

【输入】

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

【输出】

输出为一行,表达式的值。

可直接用printf("%f\n", v)输出表达式的值v。

【输入样例】

复制代码
* + 11.0 12.0 + 24.0 35.0

【输出样例】

复制代码
1357.000000

思路

思路在前边,可是题目中的是浮点数,其中有着 '.' 这个符号,该如何储存,例如把5.15存储,数位为0,那就先把5 * 10 ^(0)加到res中去,数位为1,那就把 1 * 10 ^(1) 加到res中,遇到了 '.' ,所以要将res(15)变成小数,为0.15,遇到了 5 ,就把5 * 10 ^(0)加到res中,得到了res = 5.15。

需要定义一个变量来表示数位 --- wei

代码

复制代码
#include <iostream>
#include <string>


using namespace std;

float stk[100]; // 数组模拟栈
int tt;

int main(void)
{

    string arr;
    getline(cin, arr);

    float res = 0.; // 存储着要入栈的数
    for (int i = arr.size() - 1; i >= 0; i--)
    {
        if (arr[i] == ' ')
        {
            ;
        }
        else if (arr[i] == '+')
        {
            stk[tt - 1] = stk[tt] + stk[tt - 1];
            tt--;
        }
        else if (arr[i] == '-')
        {
            stk[tt - 1] = stk[tt] - stk[tt - 1];
            tt--;
        }
        else if (arr[i] == '*')
        {
            stk[tt - 1] = stk[tt] * stk[tt - 1];
            tt--;
        }
        else if (arr[i] == '/')
        {
            stk[tt - 1] = stk[tt] / stk[tt - 1];
            tt--;
        }
        else
        {   
            int wei = 0;  // 代表这个数该乘以10的几次方
            while (arr[i] != ' ')
            {
                
                if (arr[i] == '.')
                {
                    wei = 0; //重新赋为0,因为下一位是个位
                    while (res > 1) //将res变成小数点后的数
                    {
                        res /= 10;
                    }
                    i-- ;
                }
                else
                {
                    int temp = arr[i] - '0';
                    for (int i = 0; i < wei; i++)
                    {
                        temp *= 10;
                    }
                    res += temp;
                    i--;
                    wei++;
                }
            }

            stk[++tt] = res;
            res = 0. ;
        }
    }

    printf("%f\n", stk[tt]);
    return 0;
}
相关推荐
程序员弘羽几秒前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
冰糖猕猴桃23 分钟前
【Python】进阶 - 数据结构与算法
开发语言·数据结构·python·算法·时间复杂度、空间复杂度·树、二叉树·堆、图
lifallen37 分钟前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
DolphinDB2 小时前
如何在C++交易系统中集成高性能回测与模拟撮合
c++
筏.k2 小时前
C++ 网络编程(14) asio多线程模型IOThreadPool
网络·c++·架构
2401_881244402 小时前
Treap树
数据结构·算法
乌萨奇也要立志学C++2 小时前
二叉树OJ题(单值树、相同树、找子树、构建和遍历)
数据结构·算法
爱喝茶的小茶3 小时前
周赛98补题
开发语言·c++·算法
OpenC++3 小时前
【C++】备忘录模式
c++·设计模式·备忘录模式
小庞在加油4 小时前
《dlib库中的聚类》算法详解:从原理到实践
c++·算法·机器学习·数据挖掘·聚类