• 前缀表达式


    前缀表达式是一种数学表达式的表示方法,其中运算符位于操作数之前。它也被称为波兰表达式(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

    代码 

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. float stk[100]; // 数组模拟栈
    5. int tt;
    6. int main(void)
    7. {
    8. string arr;
    9. getline(cin, arr);
    10. float res = 0.; // 存储着要入栈的数
    11. for (int i = arr.size() - 1; i >= 0; i--)
    12. {
    13. if (arr[i] == ' ')
    14. {
    15. ;
    16. }
    17. else if (arr[i] == '+')
    18. {
    19. stk[tt - 1] = stk[tt] + stk[tt - 1];
    20. tt--;
    21. }
    22. else if (arr[i] == '-')
    23. {
    24. stk[tt - 1] = stk[tt] - stk[tt - 1];
    25. tt--;
    26. }
    27. else if (arr[i] == '*')
    28. {
    29. stk[tt - 1] = stk[tt] * stk[tt - 1];
    30. tt--;
    31. }
    32. else if (arr[i] == '/')
    33. {
    34. stk[tt - 1] = stk[tt] / stk[tt - 1];
    35. tt--;
    36. }
    37. else
    38. {
    39. int wei = 0; // 代表这个数该乘以10的几次方
    40. while (arr[i] != ' ')
    41. {
    42. if (arr[i] == '.')
    43. {
    44. wei = 0; //重新赋为0,因为下一位是个位
    45. while (res > 1) //将res变成小数点后的数
    46. {
    47. res /= 10;
    48. }
    49. i-- ;
    50. }
    51. else
    52. {
    53. int temp = arr[i] - '0';
    54. for (int i = 0; i < wei; i++)
    55. {
    56. temp *= 10;
    57. }
    58. res += temp;
    59. i--;
    60. wei++;
    61. }
    62. }
    63. stk[++tt] = res;
    64. res = 0. ;
    65. }
    66. }
    67. printf("%f\n", stk[tt]);
    68. return 0;
    69. }

     

  • 相关阅读:
    J-Tech Talk | 6.29首播 Python文档漫谈
    Go语言快速入门笔记
    电商API接口:如何让数据成为生产力!
    “AI在未来”公益计划,亚马逊云科技将教育资源带到更多中西部学校
    三、stm32-USART串口通讯(重定向、接发通信、控制LED亮灭)
    C++面试八股文:std::vector了解吗?
    关于如何在Arch Linux上编写自己的第一个module
    MQTT协议基础学习
    zookeeper节点类型
    【Java 基础语法】Java 的文件操作
  • 原文地址:https://blog.csdn.net/qq_66805048/article/details/133775466