前缀表达式

前缀表达式是一种数学表达式的表示方法,其中运算符位于操作数之前 。它也被称为波兰表达式(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;
}
相关推荐
wabs6669 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
wuyk55510 小时前
2.队列:先进先出的线性数据结构
c语言·数据结构·stm32·单片机
会周易的程序员10 小时前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图
lsylalalala11 小时前
常见的排序算法1
数据结构·算法·排序算法
wuminyu12 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
gumichef12 小时前
第二章:C/C++内存管理
c++·内存管理
imaol112 小时前
数据结构---队列
java·数据结构·算法
疯狂打码的少年12 小时前
【数据结构】串的模式匹配:KMP算法(重点)
数据结构·笔记·算法
一米阳光866112 小时前
软考(中级)软件设计师核心笔记(8)数据结构——线性结构、数组、矩阵
数据结构·笔记·职场发展·软考·软件设计师·中级职称
疯狂打码的少年14 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法