首页 > 其他分享 >求前缀表达式的值

求前缀表达式的值

时间:2024-06-06 19:33:20浏览次数:13  
标签:前缀 top pop else stod 表达式

1.题目

7-7 求前缀表达式的值

分数 25

全屏浏览

切换布局

作者 DS课程组

单位 浙江大学

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含+-*/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0

2 .分析

        用到两个栈 先把前缀表达式存入栈1,然后从末尾向前扫描.

        如果遇到数字入栈2。

        遇到运算符,将栈2的2个栈顶元素弹出运算,再把运算结果再次入栈2。

        重复上述操作,最后栈2的元素就是结果。

        注意的点是:除法运算时要注意除数为0的情况

3.代码

#include<iostream>
#include<stack>
using namespace std;
int main(){
    stack<string> s;     //栈1
    stack<string> c;     //栈2
    string ch,str;
    double a,b;
    bool f=true;         //判断除数为0的情况
    while(cin>>str){s.push(str);}
    while(!s.empty()){
        if(s.top()!="+"&&s.top()!="-"&&s.top()!="*"&&s.top()!="/"){   //不是运算符入栈2
            c.push(s.top());
            s.pop();
        }
        else{
            if(s.top()=="+"){           //判断是哪种运算符
                s.pop();
                a=stod(c.top());
                c.pop();
                b=stod(c.top());
                c.pop();
                c.push(to_string(a+b));
            }
            else if(s.top()=="-"){
                s.pop();
                a=stod(c.top());
                c.pop();
                b=stod(c.top());
                c.pop();
                c.push(to_string(a-b));
            }
            else if(s.top()=="*"){
                s.pop();
                a=stod(c.top());
                c.pop();
                b=stod(c.top());
                c.pop();
                c.push(to_string(a*b));
            }
            else if(s.top()=="/"){
                s.pop();
                a=stod(c.top());
                c.pop();
                b=stod(c.top());
                c.pop();
                if(b){c.push(to_string(a/b));}     //如果除数为0,输出error
                else{
                    f=false;
                    break;
                }
            }
            else{f=false;}
        }
    }
    if(f){
        a=stod(c.top());
        printf("%.1f",a);     //保留一位小数
    }
    else{cout<<"ERROR"<<endl;}
    return 0;
}

标签:前缀,top,pop,else,stod,表达式
From: https://blog.csdn.net/m0_75262437/article/details/139454682

相关文章

  • python---正则表达式
    ==本章目标:1:能够知道在Python中使用正则要导入的模块;[了解]   re模块2:能够使用re模块匹配单个字符;[重点]   \d \w 正则表达式的概述:基本介绍正则表达式,也叫做规则表达式,通常会说成[正则]实际上正则表达式就是指符合一定规则的字符串,同时他能用......
  • python 正则表达式使用简介和实用技巧
    元字符释义.代指任意字符^从字符串开始匹配$匹配字符串的结尾*匹配前面挨着的字符,能匹配0到无穷次+同*,能匹配1到无穷次(最少1个)?匹配前面挨着的字符,匹配0或1次{}自定义匹配次数,{1,6}匹配1到6次,{6}匹配6次(重复匹配前面挨着的字符)......
  • Qt 正则表达式 QRegularExpression
    正则表达式QRegularExpression学习在Qt中有两种和正则相关的类,一种是QRegExp类,今天查资料说的好像是从Qt4传承下来的,BUG相对来说比较多,目前基本已停止维护了,多用于正则匹配,还有一种就是今天要讲的QRegularExpression类,是Qt5新开辟出来的类,相对来说比较完善(网上这......
  • prometheus表达式常用公式
    1._over_time()下面的函数列表允许传入一个区间向量,它们会聚合每个时间序列的范围,并返回一个瞬时向量avg_over_time(range-vector):区间向量内每个度量指标的平均值。min_over_time(range-vector):区间向量内每个度量指标的最小值。max_over_time(range-vector):......
  • 正则表达式学习(3)——语法
    普通字符[abc]匹配中括号的所有字符[^abc]匹配除了中括号的所有字符[A-Z]匹配A-Z的大写字母区间内的字符[a-z]匹配a-z的小写字母区间内的字符[0-9]匹配0-9的数字.匹配除了换行、回车(\n,\r)的单个字符,等价于[^\n\r]\s是匹配所有空白符,包括换行\S非空白符,不包括换......
  • cron表达式语法规则及常见示例
    cron表达式语法规则及常见示例cron表达式产生的背景什么是cron表达式常见示例cron表达式产生的背景cron表达式最初是由Unix操作系统中的cron守护进程所使用的一种语法规则,用于设置定时任务。cron守护进程是Unix系统中的一个后台进程,用于周期性地执行指定的命令或脚本......
  • 正则表达式学习(2)---字符特性
    正则表达式特性字符匹配普通字符:匹配字面值。元字符:元字符具有特殊的含义,例如\d匹配任意数字字符,\w匹配任意字母数字字符,.匹配任意字符(除了换行符)等。量词*:匹配前面的模式零次或多次,例如aa*+:匹配前面的模式一次或多次,例如aa+?:匹配前面的模式零次或一次,例如aa?......
  • 正则表达式学习(1)——模式
    正则表达式用于处理字符和字符串,是一种强大的工具1.正则表达式的模式字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。特殊字符:例如点号.、星号*、加号+、问号?等,它们具有特殊的含义和功能。字符类:用方括号[]包围的字符集合,用于匹配方括号内的任......
  • 快速入门C++正则表达式
    正则表达式(RegularExpression,简称Regex)是一种强大的文本处理工具,广泛用于字符串的搜索、替换、分析等操作。它基于一种表达式语言,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式不仅在各种编程和脚本语言中被广泛支持,还是很多文本编辑器和处理工......
  • 正则表达式
    正则表达式含义:正则表达式是由一些具有特殊含义的字符组成的字符串,多用于查找、替换符合规则的通俗来讲就是按照某种规则来匹配符合条件的字符串。一、元字符元字符:即为有特定含义的字符,常见的元字符如下:代码说明.匹配除换行符以外的任意字符,只有一个字符例外(\n)\s匹配......