【编程题]算术表达式求值。演示程序和源程序已给出。用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-+/0。写源程序中的double deal_exp (char*exp)函数,对这个算术表达式求值,返回结果。不限制方法,你可以用“原始”的多遍日描字符串,也可以用先进一点的栈(本课程前面接触的栈都是操作系统提供给程序以实现局部变量定义和函数调用的,现在你需要自己创建并使用栈了)。为便于集中精力在功能方面,可以不用检查用户输入的合法性。

时间: 2024-02-06 08:12:08 浏览: 33
下面是一个使用栈实现的算术表达式求值的函数 `deal_exp` 的实现: ```c++ #include <stack> #include <cstring> #include <cctype> double deal_exp(char* exp) { std::stack<double> nums; std::stack<char> ops; int len = strlen(exp); for (int i = 0; i < len; i++) { if (isspace(exp[i])) { // 忽略空格 continue; } else if (isdigit(exp[i]) || (i == 0 && exp[i] == '-')) { // 处理数字 int j = i; while (isdigit(exp[j+1])) j++; std::string num_str(exp+i, j-i+1); double num = std::stod(num_str); nums.push(num); i = j; } else if (exp[i] == '+' || exp[i] == '-') { // 处理加减号 while (!ops.empty() && (ops.top() == '+' || ops.top() == '-' || ops.top() == '*' || ops.top() == '/')) { double num2 = nums.top(); nums.pop(); double num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); if (op == '+') { nums.push(num1 + num2); } else if (op == '-') { nums.push(num1 - num2); } else if (op == '*') { nums.push(num1 * num2); } else if (op == '/') { nums.push(num1 / num2); } } ops.push(exp[i]); } else if (exp[i] == '*' || exp[i] == '/') { // 处理乘除号 while (!ops.empty() && (ops.top() == '*' || ops.top() == '/')) { double num2 = nums.top(); nums.pop(); double num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); if (op == '*') { nums.push(num1 * num2); } else if (op == '/') { nums.push(num1 / num2); } } ops.push(exp[i]); } } while (!ops.empty()) { // 处理剩余的运算符 double num2 = nums.top(); nums.pop(); double num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); if (op == '+') { nums.push(num1 + num2); } else if (op == '-') { nums.push(num1 - num2); } else if (op == '*') { nums.push(num1 * num2); } else if (op == '/') { nums.push(num1 / num2); } } return nums.top(); } ``` 该函数首先定义了两个栈,一个用于存储数字,一个用于存储运算符。然后遍历算术表达式的每个字符,根据字符的类型,分别进行处理: - 如果是空格,直接忽略; - 如果是数字,将其解析成 `double` 类型的数字,压入数字栈中; - 如果是加减号,先将栈中的乘除号运算完,再将加减号压入运算符栈中; - 如果是乘除号,先将栈中的乘除号运算完,再将乘除号压入运算符栈中。 处理完整个表达式之后,再将运算符栈中的运算符依次弹出,并根据运算符类型进行相应的计算,最终得到结果并返回。

相关推荐

rar

最新推荐

recommend-type

CDMA扩频通信系统仿真实验包括实验原理步骤和源程序-CDMA通信系统.doc

CDMA扩频通信系统仿真实验包括实验原理步骤和源程序-CDMA通信系统.doc 实验讨论的CDMA通信系统的仿真,采用的是直扩方式,信息没有经过调制,伪随机码采用的是63位GOLD序列.本课程的目的是熟悉CDMA通信系统的构架,...
recommend-type

C++中头文件和源文件详细介绍

主要介绍了C++中头文件和源文件详细介绍的相关资料,需要的朋友可以参考下
recommend-type

学生成绩信息管理系统论文和源程序

它是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,它能够为用户提供充足的信息和快捷的查询手段。能有效的帮助学校和老师掌握学生的情况,为学生提供成绩跟课程方面的查询。学生...
recommend-type

单片机万年历电子钟设计报告含电路图和源程序

电子万年历的电路图和源程序,功能有:显示年月日、星期、时钟、闹铃、温度。
recommend-type

Java_Spring Boot 3主分支2其他分支和Spring Cloud微服务的分布式配置演示Spring Cl.zip

Java_Spring Boot 3主分支2其他分支和Spring Cloud微服务的分布式配置演示Spring Cl
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。