当前位置: 首页 > news >正文

4.2 实现基于栈的表达式求值计算器(难度4/10)

本作业主要考察:解释器模式的实现思想/栈结构在表达式求值方面的绝对优势

C++数据结构与算法夯实基础作业列表

通过栈的应用,理解特定领域设计的关键作用,给大家眼前一亮的感觉。深刻理解计算机语言和人类语言完美结合的杰作。是作业中的上等作品,是数据结构与算法的典型代表。

这个作业是我最心爱的一个。因为我有个盗版Win10居然打不开计算器;还有就是一些高级比如指数运算怕不会操作Windows的自带计算器算错,要用自己的计算器再验证一遍;第三个就是Windows的计算器不支持回车键和命令行,我的就可以,回车一下就行,Windows的总是要鼠标点来点去,烦不胜烦。

需求如下:

实现表达式求值的计算器,以支持加、减、乘、除、指数幂、括号,6种操作。

实现代码完成下面的测试用例,要求和预期输出结果一致

接口提示(可以自行定义接口,只要实现合理,能实现需求就行):

Stackitem.h

#pragma once#include <iostream> //ostream
using namespace std;template<typename T> class CStack;template<typename T>
class CStackitem
{
public:friend class CStack<T>;CStackitem(void);CStackitem(T _data);CStackitem(const CStackitem& _item);~CStackitem(void);const T GetData(void) const;private:CStackitem& operator=(const CStackitem& _item);//disallow a = b;private:CStackitem* pPre;CStackitem* pNext;T data;
};

Stack.h

#pragma once#include "Stackitem.h"template<typename T>
class CStack
{
public:CStack(void);CStack(const CStack& _stack);~CStack(void);public:const T& top(void) const;bool empty(void) const;size_t size(void) const;void push(const CStackitem<T>& _item);const T pop(void);private:CStack& operator=(const CStack& _stack);//a = b; is not allowedprivate:CStackitem<T>* m_pTail;size_t m_size;
};

Calculator.h

#pragma once#include <iostream>
#include <list>
#include <string>
#include <sstream>
using namespace std;#include "ExpressionException.h"typedef list<string> Expression;ostream& operator<<(ostream& _os, const Expression& _item);class Calculator
{
public:Calculator(const char* _infix);Calculator(const string& _infix);~Calculator(void);public:string GetExpression(void) const;void SetExpression(const string& _expression);template<typename T>T GetValue(void ) const;Expression ToPostfix(void) const;public:static Expression ToPostfix(const string& pre);static bool Check(const string& _expression, string& _invalidInfor);private:static void ToPostfix(const string& pre, Expression& post);static bool IsOperator(char op);                         // 判断是否为运算符 static int Priority(char op);                            // 求运算符优先级 static void ReadSpace(string::const_iterator& _itr, string::const_iterator& _end);static void ReadNumber(string::const_iterator& itr, string::const_iterator& _end, string& _value);private:string m_infix;
};

main.cpp

#include <iostream>
#include <string>
#include <cassert>
#include <list>
using namespace std;#include "Stack.h"
#include "Calculator.h"void InputAndCalculator(list<Calculator>& listCalculator);
void Output(const list<Calculator>& listCalculator);
void TestAll(list<Calculator>& listCalculator);int main(int argc, char** argv)
{cout<<"support: + - * / ^ ( )"<<endl;cout<<"Input 0 for end your input."<<endl;list<Calculator> listCalculator;InputAndCalculator(listCalculator);//Extra credit 1:(1)any space (2)catch invalid inputreturn 0;
}
void InputAndCalculator(list<Calculator>& listCalculator)
{while (true){string sLine, invalidInfor;getline(cin, sLine);if (Calculator::Check(sLine, invalidInfor) == false)//Extra credit 1:(1)any space (2)catch invalid input{cout<<invalidInfor<<endl;continue;}listCalculator.push_back(sLine);Output(listCalculator);listCalculator.clear();}
}

参考答案:

C++表达式求值(Stack and Expression)​

blog.csdn.net/calmreason/article/details/78163268​编辑

相关文章:

4.2 实现基于栈的表达式求值计算器(难度4/10)

本作业主要考察&#xff1a;解释器模式的实现思想/栈结构在表达式求值方面的绝对优势 C数据结构与算法夯实基础作业列表 通过栈的应用&#xff0c;理解特定领域设计的关键作用&#xff0c;给大家眼前一亮的感觉。深刻理解计算机语言和人类语言完美结合的杰作。是作业中的上等…...

持续性能优化:确保应用保持高性能

在当今数字化时代&#xff0c;应用程序的性能已经成为用户体验和业务成功的关键因素之一。无论是Web应用、移动应用还是企业级软件&#xff0c;用户对于速度和响应性的要求越来越高。因此&#xff0c;持续性能优化已经成为保证应用在竞争激烈的市场中脱颖而出的重要策略。 什么…...

Jupyter installation Tutorial

文章目录 1. 面向的系统2. 什么是Jupyter&#xff1f;3. 安装Python环境4. 安装Jupyter notebook5. Jupyter的启动和配置6. Jupyter的使用技巧7. conclusion参考文献 1. 面向的系统 Windows安装 2. 什么是Jupyter&#xff1f; Jupyter Notebook是一个开源的Web应用程序&…...

css-定位position 理论

1.1网页常见布局方式 1.标准流 1.块级元素独占一行直布局 2.行内元素/行内块元素一行显示多个 ------>水平布局 2.浮动 1. 可以让原本垂直布局的 块级元素变成水平布局 3.定位 1. 可以让元素自由的摆放在网页的任意位置 2. 一般用于 盒子之间的层叠情况 1.2使用定位的步骤…...

软件测试规范

1、概述 本规范是对项目软件测试的一份指导性文件&#xff0c;对软件测试过程中所涉及到的测试理论、测试类型、测试方法、测试标准、测试流程以及软件产品开发单位所承担的职责进行总体规范&#xff0c;以有效保证软件产品的质量。 2、测试目的 测试的目的就是在软件交付前…...

Volatile 关键字提供的可见性

/*** 类说明&#xff1a;演示Volatile的提供的可见性*/ public class VolatileCase {// 说明&#xff1a;当ready没有volatile修饰时&#xff0c;执行结果是PrintThread线程一直处于被挂起状态&#xff0c;子线程感知不到主线程中的变量// 当ready被volatile修饰时&#xff0c;…...

Vue学习(三)

一、列表渲染 v-for指令 用于展示列表数据 语法<li v-for"(item, index) in items" :key"index"></li>key可以是index,最好是遍历对象的唯一标识 可遍历&#xff1a;数组、对象 <!DOCTYPE html> <html lang"en">&l…...

贝锐蒲公英异地组网路由器如何设置虚拟串口功能?

蒲公英虚拟串口功能&#xff0c;可实现智能组网内的其它成员异地调试此串口&#xff0c;无需到现场进行调试&#xff0c;为企业降低运营成本、便捷掌控设备数据。 1. 蒲公英硬件设置串口 进入蒲公英云管理平台&#xff0c;点击【工业应用】->【串口设置】&#xff0c;开启…...

MySQL 8.1.0 推出 InnoDB Cluster 只读副本

全面了解 8.1.0 版本新功能&#xff1a;InnoDB Cluster 只读副本的相关操作。 作者&#xff1a;Miguel Arajo 高级软件工程师 / Kenny Gryp MySQL 产品总监 本文来源&#xff1a;Oracle MySQL 官网博客 * 爱可生开源社区出品。 前言 MySQL 的第一个 Innovation 版本 8.1.0 已…...

java并发编程 PriorityBlockingQueue详解

文章目录 1 PriorityBlockingQueue是什么2 核心属性详解3 核心方法详解3.1 offer(E e)3.2 poll()3.3 take()3.4 peek() 4 总结 1 PriorityBlockingQueue是什么 PriorityBlockingQueue类上的注释描述&#xff1a;一个无界阻塞队列&#xff0c;它使用与类PriorityQueue相同的排序…...

SpringMVC_基本使用

一、JavaWEB 1.回顾 JavaWEB 1.1新建项目结构 新建 javaweb 项目目录结构 1.2导入依赖 依赖 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>…...

大屏开发,浏览器的可视区域和设备的分辨率

在线屏幕检测 - 显示器检测 - 显示器坏点检测工具...

【微服务部署】06-日志集成

文章目录 1. EFK日志三件套集成1.1 核心组件1.2 部署 2. Exceptionless日志系统2.1 Exceptionless核心特性2.2 Exceptionless部署文件2.3 K8s中使用Exceptionless 1. EFK日志三件套集成 1.1 核心组件 Elasticsearch&#xff08;存储&#xff09;Fluentd&#xff08;收集器&am…...

【Python】python使用docxtpl生成word模板

python使用docxtpl生成word模板 python-docxtpl包简单使用和实战&#xff0c;Python处理word&#xff0c;docx文件。 最近需要处理一些爬虫得到的数据来进行一些自动化报告的操作&#xff0c;因为需要生成的是word的报告&#xff0c;所以估选用docxtpl库来直接生成模板 docxt…...

C++学习笔记总结练习:多态与虚函数

1 多态 多态分类 静态多态&#xff0c;是只在编译期间确定的多态。静态多态在编译期间&#xff0c;根据函数参数的个数和类型推断出调用的函数。静态多态有两种实现的方式 重载。&#xff08;函数重载&#xff09;模板。 动态多态&#xff0c;是运行时多态。通过虚函数机制实…...

linux 批量更改指定后辍文件的可执行权限

要在Linux上批量更改指定后缀文件的可执行权限&#xff0c;您可以使用find命令来查找这些文件&#xff0c;然后使用chmod命令来更改它们的权限。以下是一些步骤&#xff1a; 1. 打开终端。 2. 使用 find 命令查找要更改权限的文件&#xff0c;例如&#xff0c;如果您想要更…...

数据结构(Java实现)-Map和Set

搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它的左右子树也…...

C++进程、线程、内存管理

目录 进程和线程区别 进程和线程切换的区别 系统调用流程 系统调用是否会引起线程切换 为什么需要使用虚拟内存 进程和线程区别 本质区别&#xff1a; 进程是资源分配的基本单元。 线程是操作系统调度的基本单元。 地址空间&#xff1a; 进程具有独立的虚拟地址空间。 线程…...

打车系统网约车系统开发支持APP公众号H5小程序版本源码

一、操作流程 二、业务模式 三、用户端 用户注册登录&#xff1a;未注册的手机号将自动创建账号 通过好友的邀请链接进行注册&#xff0c;将会绑定上下级关系 也可以注册的时候输入好友的邀请码&#xff0c;也可以绑定关系 用户充值&#xff1a; 用户下单支付时&#xff0c;可以…...

HTTP/1.1协议的状态码

2023年8月30日&#xff0c;周三下午 HTTP/1.1协议定义了一组状态码&#xff0c;用于表示请求的处理结果。 每个状态码都有特定的含义&#xff0c;它们以三位数字的形式出现在响应的状态行中。 下面是一些常见的HTTP/1.1协议的状态码及其含义&#xff1a; 1xx&#xff08;信息…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...