前缀表达式

前缀表达式是一种数学表达式的表示方法,其中运算符位于操作数之前 。它也被称为波兰表达式(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;
}
相关推荐
艾莉丝努力练剑25 分钟前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
胡萝卜3.040 分钟前
深入理解string底层:手写高效字符串类
开发语言·c++·学习·学习笔记·string类·string模拟实现
kyle~40 分钟前
计算机系统---CPU的进程与线程处理
linux·服务器·c语言·c++·操作系统·计算机系统
只是懒得想了1 小时前
用C++实现一个高效可扩展的行为树(Behavior Tree)框架
java·开发语言·c++·design-patterns
bkspiderx1 小时前
C++设计模式之行为型模式:模板方法模式(Template Method)
c++·设计模式·模板方法模式
我是华为OD~HR~栗栗呀1 小时前
华为OD-23届考研-Java面经
java·c++·后端·python·华为od·华为·面试
mit6.8241 小时前
pq|二维前缀和
c++
小此方1 小时前
C语言自定义变量类型结构体理论:从初见到精通(下)
c语言·数据结构·算法
im_AMBER1 小时前
数据结构 05 栈和队列
数据结构·笔记·学习
_poplar_2 小时前
15 【C++11 新特性】统一的列表初始化和变量类型推导
开发语言·数据结构·c++·git·算法