使用c++设计一个计算器

 使用c++设计一个简单的计算器,它支持不带括号的四则运算,计算器要满足先乘除后加减的规则

#include <iostream>
#include <string>
#include <vector>
#include <sstream>// 定义运算符的优先级
int precedence(char op) {if (op == '*' || op == '/')return 2;if (op == '+' || op == '-')return 1;return 0;
}// 执行基本的算术运算
double applyOp(double a, double b, char op) {switch(op) {case '+': return a + b;case '-': return a - b;case '*': return a * b;case '/': return a / b;}return 0;
}// 主要的计算函数
double calculate(std::string expression) {std::vector<double> values;std::vector<char> ops;std::stringstream ss(expression);std::string token;while (ss >> token) {if (token == "+" || token == "-" || token == "*" || token == "/") {// 处理运算符while (!ops.empty() && precedence(ops.back()) >= precedence(token[0])) {double b = values.back(); values.pop_back();double a = values.back(); values.pop_back();char op = ops.back(); ops.pop_back();values.push_back(applyOp(a, b, op));}ops.push_back(token[0]);} else {// 处理数字values.push_back(std::stod(token));}}// 处理剩余的运算while (!ops.empty()) {double b = values.back(); values.pop_back();double a = values.back(); values.pop_back();char op = ops.back(); ops.pop_back();values.push_back(applyOp(a, b, op));}return values.back();
}int main() {std::string expression;std::cout << "请输入一个算术表达式(数字和运算符之间用空格分隔):" << std::endl;std::getline(std::cin, expression);double result = calculate(expression);std::cout << "计算结果:" << result << std::endl;return 0;
}

这个程序的工作原理如下:

  1. precedence 函数定义了运算符的优先级,乘除的优先级高于加减。
  2. applyOp 函数执行基本的算术运算。
  3. calculate 函数是主要的计算函数:
    • 它使用两个向量:一个存储数值,另一个存储运算符。
    • 它遍历输入的表达式,对于每个标记(数字或运算符):
      • 如果是运算符,它会检查优先级。如果栈顶的运算符优先级更高或相等,就先计算栈顶的运算。
      • 如果是数字,直接压入数值栈。
    • 最后,它处理剩余的运算。
  4. main 函数中,我们从用户那里获取输入的表达式,然后调用 calculate 函数进行计算。

这个计算器能够正确处理不带括号的四则运算,并且遵循先乘除后加减的规则。例如:

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

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

相关文章

Java Records: 简化数据携带类的利器

Java Records: 简化数据携带类的利器 引言 在 Java 14 中引入并在 Java 16 中成为正式特性的 record&#xff0c;是为了简化不可变数据携带类的创建。它极大地减少了样板代码&#xff0c;使得代码更加简洁和易读。本文将详细介绍 record 的用法和特点。 什么是 Record? re…

Lua 流程控制

Lua 流程控制 Lua 是一种轻量级的编程语言,通常用于嵌入应用程序中,提供灵活的扩展和定制功能。流程控制是编程语言的核心组成部分,它决定了程序执行的顺序和条件。在 Lua 中,流程控制主要通过条件语句、循环语句和函数调用实现。 条件语句 条件语句用于根据不同的条件执…

Java访问修饰符的区别

public&#xff1a;公开的&#xff0c;任何地方都可以访问。 protected&#xff1a;受保护的&#xff0c;同一个包中的类和所有子类(可跨包)可以访问。 private&#xff1a;私有的&#xff0c;只有在同一个类中可以访问。 默认&#xff08;无修饰符&#xff09;&#xff1a;包级…

ORBSLAM3_ROS_Ubuntu18_04环境搭建安装

orbslam3安装 ORB-SLAM3配置及安装教程&#xff08;2023.3&#xff09;_orbslam3安装-CSDN博客 换源&#xff0c;换成国内的 搜索software 安装工具 sudo apt install git sudo apt update sudo apt install gcc g cmake安装 cmake安装新版本 ubuntu20.04安装cmake详细…

转让无区域商业管理公司基本流程和要求

无区域公司转让的条件和要求取决于您的业务需求和目标。我们的专业团队将与您合作&#xff0c;深入了解您的公司背景、行业情况和发展计划&#xff0c;为您量身定制适合您的转让方案。无论是公司规模、经营期限、资产状况还是法律形式&#xff0c;我们都将综合考虑确保达到您的…

乙级资质企业开展物理污染防治工程的设计规范

1. 国家和地方标准 乙级资质企业首先必须遵守国家和地方有关物理污染防治工程设计的各项标准和规范&#xff0c;包括但不限于&#xff1a; GB/T 36610-2018《环境影响评价技术导则 声环境》&#xff1a;用于指导噪声污染防治工程的设计。 GB 8702-2014《电磁环境控制限值》&…

一键掌控,文件格式转换无忧!轻松驾驭各种文件格式,高效管理您的数字世界

信息爆炸的时代&#xff0c;我们每天都会接触到各种各样的文件格式。无论是工作文档、图片、视频还是音频文件&#xff0c;它们都以不同的格式存在于我们的电脑和移动设备中。然而&#xff0c;不同的软件和应用往往只支持特定的文件格式&#xff0c;这给我们的工作和生活带来了…

数据结构历年考研真题对应知识点(树的基本概念)

目录 5.1树的基本概念 5.1.2基本术语 【森林中树的数量、边数和结点数的关系&#xff08;2016&#xff09;】 5.1.3树的性质 【树中结点数和度数的关系的应用&#xff08;2010、2016&#xff09;】 【指定结点数的三叉树的最小高度分析&#xff08;2022&#xff09;】 5.1…

[软件安装]Dev C++

一、下载Dev C软件安装包 1、官网下载官网 2、百度网盘下载压缩包 二、安装Dev C 1、解压Dev C软件安装包 2、找到【Dev-Cpp 5.11…】应用程序&#xff0c;右键选择【以管理员身份运行】它 3、设置语言 回到桌面&#xff0c;右键桌面上的【Dev C 5.11软件图标】&#xff0c…

全面指南:更改SQL Server端口后的用户通知策略

在企业环境中&#xff0c;出于安全或配置需求&#xff0c;可能需要更改SQL Server的默认端口。然而&#xff0c;一旦端口更改&#xff0c;所有依赖于旧端口的应用程序和用户都将受到影响。因此&#xff0c;确保所有用户和应用程序知晓并适应新的端口设置至关重要。本文将提供一…

python正在表达式.*与(.*)的区别

1、两者都能匹配任意长度任意字符&#xff08;.匹配任意字符,*匹配任意长度&#xff09;&#xff1b; 2、(.*)会将匹配的结果以组的形式匹配到赋值的变量中&#xff1b; 3、(.*)括号中加上&#xff1f;可以实现非贪婪模式(.*?) 例子&#xff1a; file_name "387-(F_PG…

短剧小程序系统cps分销开发搭建

短剧小程序系统CPS分销开发搭建是一个相对复杂但具有广阔商业前景的过程。以下是关于短剧小程序系统CPS分销开发搭建的详细步骤和要点&#xff1a; 需求分析与市场调研&#xff1a; 深入了解市场需求、用户画像和竞品分析&#xff0c;明确产品定位和功能需求。研究目标用户的消…

什么是DEQ?

DEQ (Delivered Ex Quay, Duty Paid) 是指目的港码头交货 (……指定目的港)。 这种术语规定卖方在指定目的港码头将货物交给买方处置&#xff0c;并且不办理进口清关手续。 DEQ适用范围 DEQ术语仅适用于海运、内河运输或多式联运&#xff0c;并且在目的港码头卸货时使用。如…

Swift Combine — Publisher和Subscriber的交互流程(自定义Publisher、Subscriber、Subscription)

之前的文章已经介绍过Publisher和Subscriber&#xff0c;对于概念类的东西这里就不多介绍了&#xff0c;在介绍Publisher和Subscriber的交互流程之前&#xff0c;先补充一下前面没有提到过的Subscription。 Subscription Subscription是一个协议&#xff0c;实现该协议的对象…

探索人工智能和LLM对未来就业的影响

近年来&#xff0c;人工智能&#xff08;AI&#xff09;迅猛发展&#xff0c;引发了人们的兴奋&#xff0c;同时也引发了人们对就业未来的担忧。大型语言模型&#xff08;LLM&#xff09;就是最新的例子。这些强大的人工智能子集经过大量文本数据的训练&#xff0c;以理解和生成…

Python 面试【初级】

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

安宝特方案 | AR术者培养:AR眼镜如何帮助医生从“看”到“做”?

每一种新药品的上市都需要通过大量的临床试验&#xff0c;而每一种新的手术工具在普及使用之前也需要经过反复的实践和验证。医疗器械公司都面临着这样的挑战&#xff1a;如何促使保守谨慎的医生从仅仅观察新工具在手术中的应用&#xff0c;转变为在实际手术中实操这项工具。安…

011、MongoDB副本集数据同步机制深度解析

目录 MongoDB副本集数据同步机制深度解析 1. 副本集架构概述 1.1 基本组成 1.2 节点角色 2. 数据同步过程详解 2.1 初始同步 2.2 持续复制 2.3 Oplog详解 3. 数据一致性与可用性 3.1 写关注(Write Concern) 3.2 读偏好(Read Preference) 3.3 因果一致性会话 4. 高…

python教程--基础语法

python基础语法 2.1 缩进规则2.2 函数函数定义函数调用参数传递示例 2.3 类类的定义类的实例化类的属性和方法访问示例 2.4 顺序语句结构示例 2.5 条件和分支条件语句的基本结构示例单个 if 语句嵌套条件语句 2.6 循环For 循环While 循环循环控制语句 2.7 数据类型数字类型序列…

IBCS 虚拟专线——企业网络困境的破局者

企业对于高效、稳定且成本合理的网络解决方案的需求愈发迫切。作为一家企业的技术负责人&#xff0c;我曾深陷于企业网络的种种困境之中&#xff0c;直到 IBCS 虚拟专线的出现&#xff0c;为我们带来了转机。 我们的企业在发展过程中&#xff0c;面临着诸多网络相关的挑战。随…