算法10——c++实现中缀表达式计算

2023-10-26

题目描述:
  读入一个只包含+,-,x,/的非负整数计算表达式,计算该表达式的值

输入格式:
  测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不用输出

输出格式:
  对每个测试用例输出一行,即该表达式的值,精确到小数点后两位

样例输入:

30/90-26+97-5-6-13/88*6+51/29+79*87+57*92
0

样例输出:

12178.21

思路:

  • 中缀表达式转后缀表达式
  • 对后缀表达式进行计算

中缀表达式转后缀表达式:

  • 设立一个操作符栈,用以临时存放操作符;设立一个数组或者队列,用以存放后缀表达式
  • 从左至右扫描中缀表达式,如果碰到操作数(注意:操作数可能不止一位),就把操作数加入后缀表达式中
  • 如果碰到操作符op,就将op与栈顶操作符优先级进行比较。如果op的优先级高于栈顶操作符的优先级,那么op就压入操作符栈;反之,操作符栈不断弹出操作符加入到后缀表达式中,直到op的优先级高于栈顶操作符的优先级,然后将栈顶操作符压入操作符栈
  • 重复以上操作,直到中缀表达式扫描完毕,之后若操作符栈仍有元素,则将它们依次弹出加入后缀表达式

计算后缀表达式:

  从左到右扫描后缀表达式,如果是操作数,就压入栈;如果是操作符,就连续弹出操作数(先弹出的是第二操作数,后弹出的是第一操作数),然后进行操作符的操作,生成新的操作数压入栈中。直到后缀表达式扫描完毕,这是栈中只会存在最后的结果

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<stack>
#include<queue>
#include<map>
using namespace std;

struct node{
    double num;//操作数
    char op;//操作符
    bool flag;//true表示操作数,false表示操作符
};

string str;
stack<node> s;//操作符栈
queue<node> q;//后缀表达式序列
map<char,int> op;

void Change(){//中缀表达式转后缀表达式
    double num;
    node temp;
    for(int i = 0 ; i < str.length();){
        if(str[i]>='0'&&str[i]<='9'){
            //如果是数字
            temp.flag = true;
            temp.num = str[i++]-'0';
            while(i<str.length()&&str[i]>='0'&&str[i]<='9'){
                //后面一位还是数字,说明这个数还没取完
                temp.num = temp.num*10+(str[i]-'0');
                i++;
            }
            q.push(temp);//加入后缀表达式序列
        }else{
            //如果是操作符
            temp.flag = false;
            //只要操作符栈的栈顶元素比该操作符优先级高
            //就把操作符栈栈顶元素弹出加入到后缀表达式
            while(!s.empty()&&op[str[i]]<=op[s.top().op]){
                q.push(s.top());
                s.pop();
            }
            temp.op = str[i];
            s.push(temp);
            i++;
        }
    }
    //如果操作符栈中还有操作符,就将它弹出加入后缀表达式
    while(!s.empty()){
        q.push(s.top());
        s.pop();
    }
}

 double Cal(){
        //计算后缀表达式
        double temp1,temp2;
        node cur,temp;
        while(!q.empty()){
            cur = q.front();//记录队首元素
            q.pop();
            if(cur.flag==true){
                //如果是操作数,直接压入栈
                s.push(cur);
            }else{
                temp2 = s.top().num;//第二个操作数
                s.pop();
                temp1 = s.top().num;//第一个操作数
                s.pop();
                temp.flag = true;//标记临时操作数
                if(cur.op == '+')
                    temp.num = temp1+temp2;
                else if(cur.op == '-')
                    temp.num = temp1 - temp2;
                else if(cur.op == '*')
                    temp.num = temp1 * temp2;
                else
                    temp.num = temp1 / temp2;
                s.push(temp);
            }
        }
        return s.top().num;
}

int main(){
    op['+'] = op['-'] = 1;
    op['*'] = op['/'] = 2;
    while(getline(cin,str),str!="0"){
        for(string::iterator it = str.end();it!=str.begin();it--){
            if(*it == ' ')
                str.erase(it);//把表达式中的空格删除
        }
        while(!s.empty())
            s.pop();//初始化栈
        Change();
        printf("%.2f\n",Cal());
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法10——c++实现中缀表达式计算 的相关文章

随机推荐

  • 19款资源整合类网站推荐:每一个网站都堪称以一敌百

    强烈推荐这19个资源聚合网站 每一个网站都足以堪称 以一敌百 因为每一个网站都聚合了相当多不同类型 不同领域的网站资源 并且做了分类导航方便大家查找使用 所以 与其收藏那么多零碎的网址 不如收藏下面这些网站资源 比格张 发现更好的资源 一个
  • java8的日期工具类(获取当前时间 相隔天数 小时 分钟 秒等处理)

    package com example list test import java text ParseException import java text SimpleDateFormat import java time import
  • tvm 入门(二)

    代码是一个tvm入门的例子 以向量相加为例 使用tvm的流程是 1 描述串行的向量相加是怎么做的 2 描述并行的时候 怎么对计算单元做划分 3 编译目标函数 本文所示代码可以看到用tvm生成的cuda代码 4 把编译生成的内容保存成文件 加
  • VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动 VMware Authorization Service。如果此问题仍然存

    报错界面 解决方法一 管理员身份运行即可 解决方法二 打开服务 找到VMware Authorization Service右键选择然后点启动 然后发现又报了下面的错误 不慌这时候打开属性把启动类型改成手动即可
  • String、StringBuffer和StringBuilder的异同点

    String StringBuffer StringBuilder三者的异同 String 不可变的字符序列 底层使用char 存储 StringBuffer 可变的字符序列 线程安全的 效率低 底层使用char 存储 StringBuil
  • OpenAI的人工智能语音识别模型Whisper详解及使用

    1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司 开源了 Whisper 自动语音识别系统 OpenAI 强调 Whisper 的语音识别能力已达到人类水准 Whisper是一个通用的语音识别模型 它使用了大量的多语言和
  • 安装mingw出现download failed和unable to continue

    利用mingw get setup安装mingw总是出现download failed和unable to continue错误 截图如下 错误原因 因为服务器在外网 可能是对方服务器不稳定 连接出错等问题导致 解决办法 下载对应等离线安装
  • 11信号学习之sigaction函数及使用其实现信号捕捉案例(信号最重要的一节)

    概述 注意 在我关于信号的文章中 我所说的系统的mask的意思实际上是进程的mask 每个进程的mask都是唯一的 所以我就将其称为系统的 但不能理解为每个进程的mask都是共用的 1 sigaction函数 1 上一篇我们说的signal
  • 基于STM32的DMX512开发

    首先基本了解一下DMX512的基本协议 一 DMX512协议 DMX 是Digital MultipleX 的缩写 意为多路数字传输 DMX512控制协议是美国舞台灯光协会 usITT 于1990年发布的灯光控制器与灯具设备进行数据传输的工
  • 复习使用git(二)

    删除远程分支 git push origin delete 分支名 撤销修改 撤销工作区的修改 已修改 但尚未添加 add 使用 git restore 文件名 撤销工作区的修改 Note git checkout 文件名 checkout
  • 基于STM32F407的SDCard读写操作及USB挂载(HAL库)

    基于STM32F407的SDCard读写操作及USB挂载 HAL库 本来在上一篇SD卡读写也都OK了 后来想着挂载SD卡做U盘 就去查了下资料 结果基本全是HAL库的 原来没用过HAL库 于是本着好奇的心态去下了 说实话 确实看起来简单多了
  • 【Spring Boot】——集成JSON工具

    前言 json是现在非常流程的数据交换格式 所以对于被开发人员来说如何更好了解java对象和json格式之间的转换是至关重要的 接下来我们来好好说一说 一 什么是JSON 摘自百度百科 JSON JavaScript Object Nota
  • android 涨潮动画加载_潮汐apk客户端-潮汐android最新版APP下载v2.0.1.1 免费版-腾牛安卓网...

    潮汐一个非常有特色的静心平台 它可以让你在工作困乏时聆听几分钟就可以更加高效的工作 让你的工作效率达到更好的专注 它可以让你的心情更加温和 让你的每一天不再那么浮躁和枯燥无味 让你的心情越来越舒畅 喜欢的朋友快来腾牛网下载吧 软件特色 保持
  • Linux实验报告【全集】

    若对你有帮助 记得点赞 关注我哦 实验目录 Linux常用命令 linux下的shell编程 Linux下的c编程 Linux下的API编程 每个实验的图片都比较多 一开始实验基本都是书上的例题 后面会变难 做实验时往往会想 为什么每届都做
  • 开发环境配置:服务器训练模型工具tmux基础使用

    开发环境配置 服务器训练模型工具tmux基础使用 1 tumx可以做什么 2 Ubuntu安装tmux 3 常用命令 3 1 新建会话并进入 3 2 退出会话 3 3 查看存在的会话 3 4 重新进入会话 3 5 销毁会话 1 tumx可以
  • C#检测是否在单元测试环境

    true则为单元测试环境下 false不是 bool unitTest System Environment StackTrace IndexOf NUnit Framework StringComparison CurrentCultur
  • ShareSDK集成第三方登录和分享的步骤

    转自 http my oschina net u 1024921 blog 170588 之前用过这个几次了 而每次都没有记录一下具体的步骤 这次就写一下吧 1 去ShareSDK下载官方的SDK 2 现在他们的服务特别人性化 解压SDK之
  • SiamFC:利用全卷积孪生网络进行视频跟踪

    目录 论文下载地址 代码下载地址 论文作者 模型讲解 模型结构 模型输入 损失函数 训练过程 结果分析 传送门 论文下载地址 SiamFC论文地址 SiamFC论文百度网盘下载地址 提取码 7309 SiamFC论文翻译 水印 百度网盘下载
  • Python-logging详解(彩色日志扩展,多进程安全等)

    目录 简介 日志级别 记录器 处理器 格式器 多线程与多进程安全 代码 导入及全局变量 函数 实验及结果 参考 简介 日志是工程中不可缺少的一部分 国家等保2 0也规定 至少保留日志180天 对于程序员来说 日志也方便进行记录及排错 log
  • 算法10——c++实现中缀表达式计算

    题目描述 读入一个只包含 x 的非负整数计算表达式 计算该表达式的值 输入格式 测试输入包含若干测试用例 每个测试用例占一行 每行不超过200个字符 整数和运算符之间用一个空格分隔 没有非法表达式 当一行中只有0时输入结束 相应的结果不用输