前缀表达式

前缀表达式是一种数学表达式的表示方法,其中运算符位于操作数之前 。它也被称为波兰表达式(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;
}
相关推荐
2401_868534784 小时前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
wabs6664 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
郝学胜-神的一滴5 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi20265 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
程序喵大人9 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
ZhangShao060710 小时前
题解:CF2249B
c++·算法
小玮看世界10 小时前
[Python]线段树与二分法
数据结构·算法
吹什么轩11 小时前
c++复习:map和set的使用
开发语言·c++
fpcc12 小时前
跟我学C++中级篇—内存流
开发语言·c++
吹什么轩13 小时前
c++复习:模拟实现list来更好的理解和应用list
开发语言·c++