C/C++ 表达式求值(含多位数)

个人主页:仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客

专题分栏:算法_仍有未知等待探索的博客-CSDN博客

目录

一、前言

二、解析

分析

最后直接上代码!


一、前言

表达式求值是一个比较基础的代码关于栈的使用。在写的时候充分锻炼了大脑的思维和对代码的调试能力。

如果是在纸上给一个计算表达式,你一定可以算出来,但是要用代码实现的时候就会感觉没什么思路了,接下来就来看我给你“操作一番”!

二、解析

分析

首先,从比较简单的表达式开始,看这个表达式是如何进行计算的。

 一开始,我们需要两个栈,一个用来存储操作数,另外一个用来存储运算符栈。

表达式用一个string类型进行存储(c语言的话,用一个char类型的数组也行)。然后依次遍历每个元素。

  1. 先判断这个元素是不是数字,如果是的话,就直接进操作数栈。
  2. 如果这个元素是左括号的话‘( ’ 就直接进入符号栈(括号的优先级比普通的运算符高)
  3. 如果这个元素是右括号的话‘)’ 就依次把计算(也就是操作数栈弹出两个数,符号栈弹出一个符号)直到符号栈的栈顶是左括号,把左括号出栈,然后结束循环。
  4. 如果这个元素是普通符号的话,就需要判断一下符号的优先级,如果要入栈的符号优先级高的话,就直接压栈;否则就是先计算然后再进行压栈。
  5. 最后就是计算剩在栈里面的数,直到符号栈为空,操作数栈只剩一个数。然后把这个数输出来就行。

最后直接上代码!

#include <iostream>
using namespace std;
#include <stack>
#include <unordered_map>
#include <string>stack<int>num;
stack<char>op;
string str;// 存储运算符的优先级,等价于将一个;‘+’ == 1
unordered_map<char, int>pr = { {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2} };// 计算函数
void eval()
{// 从操作数栈弹出两个数,弹出的第一个数是双目操作符右边的数,要注意int a = num.top(); num.pop();int b = num.top(); num.pop();// 从符号栈弹出一个符号char opp = op.top(); op.pop();// 计算int c = 0;if (opp == '+') c = b + a;else if (opp == '-') c = b - a;else if (opp == '*') c = b * a;else if (opp == '/') c = b / a;// 将得数进行压栈操作num.push(c);
}int main()
{// C++ 输入输出的加速语句std::ios::sync_with_stdio(false);cin.tie(0);// 读入表达式cin >> str;for (int i = 0; i < str.size(); i++){// auto 是一个关键字,系统可以根据后面赋值的数据类型自动进行匹配类型auto c = str[i];// 判断这个字符是不是数字if (isdigit(c)){auto j = i;int x = 0;// 如果这个数字的后面还是数字的话,证明数字不止一位,要进行加权操作while (j < str.size() && isdigit(str[j])){x = x * 10 + str[j] - '0';j++;}// 将i移到j - 1的位置上,因为j在最后一个循环中+1操作了// j的位置现在是在相当于第一个不是数字的位置上,然后这个判断语句结束后,// i会继续+1,所以i要移到j前一个位置上,来让下一个循环到指定的位置上i = j - 1;num.push(x);}else if (c == '(') op.push(c);// 遇到左括号直接压栈else if (c == ')')// 遇到右括号,计算到符号栈栈顶是左括号,然后左括号出栈{while (op.size() && op.top() != '(') eval();op.pop();}else// 一般情况,注意一定是while循环,不懂的可以去搜一下表达式树,方便理解{while (op.size() && pr[op.top()] >= pr[c]) eval();op.push(c);}}// 处理最后栈里的元素while (op.size()) eval();// 输出栈顶元素cout << num.top() << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB 3D技术 以vue3+vite环境为例 讲解vue项目中使用three

上文 WEB 3D 技术&#xff0c;通过node环境创建一个three案例 中 我们打造了自己的第一个Web 3D界面 那么 今天 我们就来结合vue来开发我们的3D界面 这里 我们先创建一个文件夹 作为文件目录 千万不要放C盘 我们 依旧是在终端执行命令 npm init vitelatest输入一下项目名称 …

同城线下社交搭子,同城圈子交友系统

简介:打破传统耗时耗力的交友模式&#xff0c;实现1对1,点对点的快速即时交友模式&#xff0c;线上线下 整合&#xff0c;可在线查看状态以及距离远近&#xff0c;可自行设置每单的收益提成以及代理的分佣提成。 结构: TINKPHP框架 公众号H5;系统开源&#xff0c;方便二次开发…

自动机器学习是什么?概念及应用

自动机器学习 (Auto Machine Learning) 的应用和方法 随着众多企业在大量场景中开始采用机器学习&#xff0c;前后期处理和优化的数据量及规模指数级增长。企业很难雇用充足的人手来完成与高级机器学习模型相关的所有工作&#xff0c;因此机器学习自动化工具是未来人工智能 (A…

【INTEL(ALTERA)】 quartus版本 21使用SDI II IP出现错误:无法生成示例设计example_design

项目场景&#xff1a; quartus版本 21SDI II FPGA IP 设计示例生成失败怎么办 原因分析&#xff1a; 适用于 Windows* 的英特尔 Quartus Prime Pro Edition 软件版本 21.3 和版本 21.4 以及英特尔 Quartus Prime Standard Edition 软件版本 22.1 中存在问题&#xff0c;SDI I…

ICC2:low power与pg strategy(pg_macro_conn_pattern)

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 创建hard macro上的stripe,参考示例: set pd_list{{DEFAULT_VA VDD_DIG VDD_DIG VSS} {PD_DSP VDD_DIG VDD_DSP VSS} } ;#两个电源域,DEFAULT_VA和PD_DSP是对应voltage area名字,其中DEFAULT_…

机器学习可重复性危机下,创建复杂数据系统的挑战

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 数据科学系统已成为众多研究领域的关键性工具&#xff0c;其开发者群体呈现出多元化的背景特征。在过去十年中&#xff0c;尽管数据科学与机器学习的强…

[论文笔记] 大模型主流Benchmark测试集介绍

自然语言处理(NLP)的进步往往通过在各种benchmark测试集上的表现来衡量。随着多语言和跨语言NLP研究的兴起,越来越多的多语言测试集被提出以评估模型在不同语言和文化背景下的泛化能力。在这篇文章中,我们将介绍几个主流的多语言NLP benchmark测试集,包括ARC Challenge、H…

Android hwcomposer服务启动流程

Android hwcomposer服务启动流程 客户端 binder远程调用 服务端 surfaceflinger --binder--> hwcomposer .hal文件编译时生成支持binder进程间远程调用通信的cpp文件 在out/soong/.intermediates/hardware/interfaces/graphics/composer/2.1/ 目录下找…

测试用例设计方法:功能图

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法&#xff0c;主要是针对于不同条件输入输出的组合进行测试&#xff0c;但在实际需求中&#xff0c;我们也常会遇到需要对被测对象的状态流转进行验证的情况&#xff0c;此时前面几种方法将不再适用&#xf…

005 本地安全策略

一、本地安全策略 1、概念 主要是对登录计算机的账户进行一些安全设置主要影响是本地计算机安全设置 2、打开方式 开始菜单->管理工具->本地安全策略使用命令secpol.msc从本地组策略进去&#xff0c;使用命令gpedit.msc 二、账户策略 1、密码策略&#xff08;默认情…

Java安全工具Jar包加密

jar包加密有很多种方式&#xff0c;我这边记录一下使用mavenClassFinal的方式,classFinal可以通过jar包/maven的方式来使用&#xff0c;因为maven使用较为简单&#xff0c;我仅记录使用maven的方式 在需要打包的启动程序的pom文件中添加如下plugin 1.plugin需要加在spring-boot…

Windows本地的RabbitMQ服务怎么在Docker for Windows的容器中使用

1. 进入管理界面 windows安装过程请访问&#xff1a;Windows安装RabbitMQ、添加PHP的AMQP扩展 浏览器访问&#xff1a;http://127.0.0.1:15672/ 2. 创建虚拟主机 上面访问的是 RabbitMQ 的管理界面&#xff0c;可以在这个界面上进行一些操作&#xff0c;比如创建虚拟主机、…

P1000 超级玛丽游戏

题目背景 本题是洛谷的试机题目&#xff0c;可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 P1001、P1008。 另外强烈推荐新用户必读贴 题目描述 超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。 ******** ************ …

找到字符串中所有字母异位词-中等

leetcode ****1111 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1:输入: s "cbaebaba…

CSS彩色发光液体玻璃

效果展示 CSS 知识点 animation 综合运用animation-delay 综合运用filter 的 hue-rotate 属性运用 页面整体布局 <section><div class"glass" style"--i: 1"><div class"inner"><div class"liquid"></d…

LeetCode---374周赛

题目列表 2951. 找出峰值 2952. 需要添加的硬币的最小数量 2953. 统计完全子字符串 2954. 统计感冒序列的数目 一、找到峰值 这个简单的模拟&#xff0c;代码如下 class Solution { public:vector<int> findPeaks(vector<int>& mountain) {int nmountain…

Springboot整合阿里云短信服务

目录 1.注册登录用户 2.点击AccessKey管理&#xff0c;开通使用子用户AccessKey 2.1点击进入AccessKey管理 2.2点击用户创建用户 2.3选择控制台创建 2.4权限修改 3.短信服务 4.创建Springboot项目使用SDK 4.1创建一个springboot项目 4.2导入阿里云短信Maven依赖 4.3…

N体问题-MATLAB 中的数值模拟

一、说明 万有引力是宇宙普适真理&#xff0c;当计算两个物体的引力、质量、距离的关系是经典万有引力物理定律&#xff0c;然而面向复杂问题&#xff0c;比如出现三个以上物体的相互作用&#xff0c;随时间的运动力学&#xff0c;这种数学模型将是更高级的思维方法。本文将阐述…

gin使用自签名SSL证书与自签名证书不受信任方法解决

文章目录 1. X.509 V3证书介绍2、使用openssl生成自签名证书和解决不受信任问题2.1、生成根证书2.2、为域名生成证书申请文件2.3、为域名创建证书的扩展描述文件2.4、为域名创建证书 3、Go应用中使用自签名证书3.1、gin框架调用实现3.2、运行效果 4、使用java的bouncycastle生成…

比较好的python书籍,python有什么书推荐

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;比较好的python书籍&#xff0c;python有什么书推荐&#xff0c;现在让我们一起来看看吧&#xff01; 我是在半年前接触到Python的&#xff0c;我之前没有一点编程基础&#xff0c;但在我自学的这半年里&#xff0c;我发…