《C++ Primer》练习9.52:使用栈实现四则运算

在这里插入图片描述

栈可以用来使用四则运算,是一个稍微有点复杂的题目,去学习了一下用栈实现四则运算的原理,用C++实现了一下。首先要把常见的中缀表达式改成后缀表达式,然后通过后缀表达式计算,具体的原理可以参考这位博主的文章:C语言数据结构篇——用栈实现四则运算,在数和运算符之间都加入了空格来进行分隔,方便后续的提取有效数据处理。

代码还有优化的地方,先记录一下吧:

#include <iostream>
#include <string>
#include <stack>
using namespace std;int getOperatorPriority(char &a)
{int res;if (a == '(')res = 0;else if (a == '+' || a == '-')res = 1;else if (a == '*' || a == '/')res = 2;else if (a == ')')res = 3;return res;
}
bool compareOperatorPriority(char &a, char &b)
{int a_res = getOperatorPriority(a);int b_res = getOperatorPriority(b);return a_res >= b_res;
}string createBackSeq(string &str)
{stack<char> sak;string str2;int seen = 0;int p = 0;for (int i = 0; i != str.size(); ++i){if (isdigit(str[i])){str2.append(str.substr(i, 1));if ((i + 1 != str.size() && !isdigit(str[i + 1])) || i == str.size() - 1)str2.append(" ");}else{if (sak.empty()){if (str[i] == '(')seen += 1;sak.push(str[i]);}else if (str[i] == ')'){if (seen != 0){while (sak.top() != '('){str2 += sak.top();str2.append(" ");sak.pop();}sak.pop();seen--;}elsethrow std::invalid_argument("No left bracket match!");}else{if (compareOperatorPriority(sak.top(), str[i])){if (str[i] == '('){seen++;sak.push(str[i]);}else{str2 += sak.top();str2.append(" ");sak.pop();sak.push(str[i]);}}else{sak.push(str[i]);}}}}while (!sak.empty()){if (seen != 0)throw invalid_argument("too many left barckets!");str2 += sak.top();str2.append(" ");sak.pop();}return str2;
}int calculate(string &str)
{size_t pos1 = 0;size_t pos2 = 0;stack<int> b;while (pos2 != string::npos){pos1 = str.find_first_not_of(' ', pos1);pos2 = str.find_first_of(' ', pos2);if (pos2 != string::npos){string temp = str.substr(pos1, pos2 - pos1);if (temp.find_first_not_of("0123456789") == string::npos)b.push(stoi(temp));else{if (b.size() < 2)throw std::invalid_argument("too many symbols");int right = b.top();b.pop();int left = b.top();b.pop();int res;if (temp == "+")res = left + right;else if (temp == "*")res = left * right;else if (temp == "-")res = left - right;else if (temp == "/"){if (right == 0)throw std::invalid_argument("Divided by zero.");res = left / right;}b.push(res);}pos2 += 1;pos1 = pos2;}}return b.top();
}int main()
{string str;string str2;str = "22*(1+2)-(3*4)/(2*1)";str2 = createBackSeq(str);cout << str2 << endl;cout << calculate(str2) << endl;str = "1+3*(2++5)";str2 = createBackSeq(str);cout << str2 << endl;cout << calculate(str2) << endl;	return 0;
}

测试:

input : 22*(1+2)-(3*4)/(2*1)
output :
22 1 2 + * 3 4 * 2 1 * / -
60

input : 1+3*(2+5)
output :
1 3 2 5 + * +
22

input : 1+3*((2+5)
output : terminate called after throwing an instance of 'std::invalid_argument' what(): too many left barckets!

input : 1+3*(2+5))
output : terminate called after throwing an instance of 'std::invalid_argument' what(): No left bracket match!

input : 1+3*(2+5)/0
output :
1 3 2 5 + * 0 / +
terminate called after throwing an instance of 'std::invalid_argument' what(): Divided by zero.

input : 1+3*(2++5)
output :
1 3 2 + 5 + * +
terminate called after throwing an instance of 'std::invalid_argument' what(): too many symbols.

参考:

  1. 《C++ Primer》

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

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

相关文章

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度

抖音直播招聘报白是指进入抖音的白名单&#xff0c;允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台&#xff0c;但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示&#xff0c;留存联系方式更加精…

到底什么是5G-R?

近日&#xff0c;工信部向中国国家铁路集团有限公司&#xff08;以下简称“国铁集团”&#xff09;批复5G-R试验频率的消息&#xff0c;引起了行业内的广泛关注。 究竟什么是5G-R&#xff1f;为什么工信部会在此时批复5G-R的试验频率&#xff1f; 今天&#xff0c;小枣君就通过…

公司文件防泄密软件——「天锐绿盾」@德人合科技

天锐绿盾是一款企业级数据安全解决方案&#xff0c;主要用于保护企业的知识产权、客户资料、财务数据、技术图纸、应用系统等机密信息化数据不外泄。 PC访问地址&#xff1a; &#x1f517;isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 该软件解决方案…

vue单页面应用使用 history模式路由时刷新页面404的一种可能性

原先使用的是 hash模式路由&#xff0c;因为要结合qiankun进行微前端改造&#xff0c;改成了 history模式&#xff0c;结果页面刷新之后没有正确渲染组件。按照一般思路检查 nginx配置 try_files $uri $uri/ /index.html;也配置上了&#xff0c;还是有问题。 页面异常显示 问题…

电脑重做系统---win10

电脑重做系统---win10 前言制作启动U盘材料方法打开网址下载启动盘制作工具参照官方说明进行制作使用U盘重做系统 常用软件官网地址 前言 记得最早学习装电脑还是04年左右&#xff0c;最为一个啥也不知道的大一傻白胖&#xff0c;花了几百大洋在电脑版把了个“电脑组装与维修”…

使用 KubeSkoop exporter 监测和定位容器网络抖动问题

作者&#xff1a;遐宇、溪恒 本文是 8 月 17 日直播的文字稿整理&#xff0c;文末可观看直播回放。除去文章内容外&#xff0c;还包括针对实际网络问题的实战环节。 容器网络抖动问题发生频率低&#xff0c;时间短&#xff0c;是网络问题中最难定位和解决的问题之一。 不仅如…

CVE-2017-15715 apache换行解析文件上传漏洞

影响范围 httpd 2.4.0~2.4.29 复现环境 vulhub/httpd/CVE-2017-15715 docker-compose 漏洞原理 在apache2的配置文件&#xff1a; /etc/apache2/conf-available/docker-php.conf 中&#xff0c;php的文件匹配以正则形式表达 ".php$"的正则匹配模式意味着以.ph…

见微知著:从企业售后技术支持看云计算发展

作者&#xff1a;余凯 售后业务中的细微变化 作为阿里云企业容器技术支持的一员&#xff0c;每天会面对全球各地企业级客户提出的关于容器的各种问题&#xff0c;通过这几年的技术支持的经历&#xff0c;逐步发现容器问题客户的一些惯性&#xff0c;哪些是重度用户&#xff0…

将Excel表中数据导入MySQL数据库

1、准备好Excel表&#xff1a; 2、数据库建表case2 字段信息与表格对应建表&#xff1a; 3、实现代码 import pymysql import pandas as pd import openpyxl 从excel表里读取数据后&#xff0c;再存入到mysql数据库。 需要安装openpyxl pip install openpyxl# 读入数据&#x…

【面试高频题】难度 1/5,经典树的搜索(多语言)

题目描述 这是 LeetCode 上的 「109. 有序链表转换二叉搜索树」 &#xff0c;难度为 「中等」 Tag : 「二叉树」、「树的搜索」、「分治」、「中序遍历」 给定一个单链表的头节点 head&#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&…

基于SSM的校园音乐平台系统

基于SSM的校园音乐平台系统~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 歌手管理 歌曲管理 摘要 校园音乐平台系统&#xff08;Campus Mu…

基于知识图谱建模、全文检索的智能知识管理库(源码)

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 知识图谱提供了一种从海量文本和图像中抽取结…

【C++】:初阶模板

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

【算法-动态规划】最长公共子串

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

磁盘非跨盘访问算法实现

1. 背景说明 本算法基于已将磁盘分布合并并排序为升序线性表。实现示例为&#xff1a;磁盘扇区大小&#xff1a;32&#xff08;可自定义&#xff09;&#xff0c;待拆分磁盘内存&#xff1a; [0 - 50]&#xff0c;[60 - 100]&#xff08;可增加&#xff09;。示意图如下&#x…

RISC-V 特权级架构

特权级别 级别的数值越大&#xff0c;特权级越高&#xff0c;掌控硬件的能力越强&#xff0c;在CPU硬件层面&#xff0c;M模式必须存在&#xff0c;其它模式可以不存在 执行环境调用 ecall &#xff0c;这是一种很特殊的陷入类的指令&#xff0c; 相邻两特权级软件之间的接口正…

用于物体识别和跟踪的下游任务自监督学习-2-(计算机视觉中的距离度量+损失函数)

2.4 计算机视觉中的距离度量 在深度学习和计算机视觉中&#xff0c;距离度量通常用于比较图像、视频或其他数据的特征或嵌入。根据具体任务和数据属性&#xff0c;可以使用不同类型的距离度量。下面介绍了深度学习和计算机视觉中使用的一些常见类型的距离度量。 余弦相似性距…

后端使用aop和redis实现防抖

在公司的代码开发中遇到了,快速点击就会重复提交的bug&#xff0c;刚好最近在优化代码于是想着在后端实现防抖 1.整体思路 2.创建防抖的注解 防抖我一般放在存储方法上&#xff0c;在程序运行时使用&#xff0c;于是我的防抖注解是method类型 Target(ElementType.METHOD) Ret…

【Zookeeper专题】Zookeeper选举Leader源码解析

目录 前言阅读建议课程内容一、ZK Leader选举流程回顾二、源码流程图三、Leader选举模型图 学习总结 前言 为什么要看源码&#xff1f;当然是装逼啊&#xff01;哈哈 说实在博主之前看Spring源码之前没细想过这个问题&#xff0c;只是听大佬们说【Spring是一个非常优秀的源码】…