前缀表达式

前缀表达式是一种数学表达式的表示方法,其中运算符位于操作数之前 。它也被称为波兰表达式(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;
}
相关推荐
借雨醉东风2 小时前
程序分享--常见算法/编程面试题:旋转矩阵
c++·线性代数·算法·面试·职场和发展·矩阵
云泽8083 小时前
笔试算法 - 双指针篇(二):四大经典求和题型 + 有效三角形计数问题
c++·算法
十五年专注C++开发4 小时前
WaitingSpinnerWidget: 一个高度可配置的自定义Qt等待加载动画组件
开发语言·c++·qt·waitingspinner
qeen874 小时前
【数据结构】树的基本概念及存储
c语言·数据结构·c++·学习·
一江寒逸4 小时前
数据结构与算法之美:串(字符串)——从基础操作到KMP模式匹配,吃透面试最高频的字符串考点
数据结构·面试·职场和发展
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:种树
c++·算法·贪心·csp·信奥赛·区间贪心·种树
hi_ro_a5 小时前
C++ 哈希表封装 unordered_map /unordered_set
数据结构·c++·算法·哈希算法
c++之路5 小时前
C++ 动态内存
java·jvm·c++
Jasmine_llq9 小时前
《B4447 [GESP202512 二级] 环保能量球》
数据结构·算法·数学公式计算(核心)·整数除法算法·多组数据循环处理·输入输出算法·简单模拟算法
菜鸟丁小真9 小时前
LeetCode hot100 -73.矩阵置零
数据结构·leetcode·矩阵·知识点总结