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

【程序填空】表达式计算(栈应用)C++

温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。

目录

题目描述

思路分析

AC代码 


题目描述

使用C++自带的stack栈模板来实现四则运算表达式求值

算法描述参考第3.2.5节

算法伪代码参考P53-54的算法3.4

例如

1. Push (OPTR, '#');表示把字符#压入堆栈OPTR中,转换成c++代码就是OPTR.push('#');

2. Pop(OPND, a); 表示弹出栈OPND的栈顶元素,并把栈顶元素放入变量a中。因此改成c++代码是两个操作:a = OPND.top();   OPND.pop();

3. a = GetTop(OPND)表示获取栈OPND的栈顶元素,转成c++代码就是: a = OPND.top();

大家主要是改造表达式求值函数EvaluateExpression的代码

输入

第一个输入t,表示有t个实例

第二行起,每行输入一个表达式,每个表达式末尾带#表示结束

输入t行

输出

每行输出一个表达式的计算结果,计算结果用浮点数(含2位小数)的格式表示

参考代码如下:

#include <iostream>
#include<iomanip>
using namespace std;

int main()

{ double temp = 12.345678

  cout<<fixed<<setprecision(2)<<temp<<endl;

}

输出结果为12.35

输入样例1 

2
1+2*3-4/5#
(66+(((11+22)*2-33)/3+6)*2)-45.6789#

输出样例1

6.20
54.32

提示

本题需要把一个字符串转成浮点数,例如字符串"1.234"转成浮点数1.234

因为C++11开始取消atof函数,所以C++要用sscanf函数来实现该转换,参考代码如下

#include <iostream>

#include <cstdio>

using namespace std;

int  main()

{ char TempData[]="1.23456";

double dd;

sscanf(TempData, "%lf", &dd);

cout<<dd<<endl;

return 0;

}

思路分析

思想及其巧妙,一个栈存操作数,一个栈存运算符,主要的思路就是,把优先级低的运算符和其对应的操作数压入栈,先算优先级高的操作数。

具体来说是这样的一种操作:

遍历算式,如果是数,压入操作数栈,如果是运算符,先判断这个运算符和运算符栈栈顶的运算符的优先级,如果新来的优先级更高(像 * 和 / ),直接压入栈,如果新来的更低( + 和 - ),那么需要开始计算这个运算符前面的数值,即两次弹出操作数栈栈顶元素用来计算,计算的运算符是当前运算符栈顶元素。

主要流程是这样,然后需要注意的是,这个算式是一个字符串,操作数也是一个字符串,这里就需要我们将字符串变成实数,比较巧妙的是,操作符前面一定是操作数,所以遇到操作符即遇到了操作数的结尾。

更巧妙的是这个运算符优先级的二维数组,居然可以这样比较优先级@_@。

AC代码 

代码块1

	int j = 0;
	while (c != '#' || OPTR.top() != '#') {
		if (In(c, OPSET)) {
			if (x) {
				TempData[j] = '\0';
				sscanf(TempData, "%lf", &Data);
				OPND.push(Data);
				strcpy(TempData, "\0");
				j = 0;
			}
			switch (precede(OPTR.top(), c)) {
				case '<':
					OPTR.push(c);
					c = MyExp[++i];
					break;
				case '=':
					OPTR.pop();
					c = MyExp[++i];
					break;
				case '>':
					a = OPND.top();
					OPND.pop();
					b = OPND.top();
					OPND.pop();
					OPND.push(Operate(b, OPTR.top(), a ));
					OPTR.pop();
					x = 0;
					break;
			}
		} else {
			TempData[j++] = c;
			c = MyExp[++i];
			x = 1;
		}
	}
	return OPND.top();

 代码块2

double Operate(double a, unsigned char theta, double b) { //计算类似a+b的表达式结果
	if (theta == '+')return a + b;
	if (theta == '-')return a - b;
	if (theta == '*')return a * b;
	return a / b;
}
bool In(char Test, char* TestOp) { //判断字符Test是否是运算符,是则返回true
	if (Test == '+' || Test == '-' || Test == '*' || Test == '/' || Test == '(' || Test == ')' || Test == '#')return true;
	return false;
}
char precede(char Aop, char Bop) { //返回两个运算符优先级的比较结果
	int i, j;
	switch (Aop) {
		case'+':
			i = 0;
			break;
		case'-':
			i = 1;
			break;
		case'*':
			i = 2;
			break;
		case'/':
			i = 3;
			break;
		case'(':
			i = 4;
			break;
		case')':
			i = 5;
			break;
		case'#':
			i = 6;
			break;
	}
	switch (Bop) {
		case'+':
			j = 0;
			break;
		case'-':
			j = 1;
			break;
		case'*':
			j = 2;
			break;
		case'/':
			j = 3;
			break;
		case'(':
			j = 4;
			break;
		case')':
			j = 5;
			break;
		case'#':
			j = 6;
			break;
	}
	return Prior[i][j];
}

相关文章:

  • 朴素贝叶斯关于naivebayes包核函数等
  • 泛型的详解
  • 数据填报系统可有效解决业务部门哪些问题?_光点科技
  • 【Web基础】FilterListener
  • 【数模】数模入门与常用算法汇总
  • 【深度学习100例】—— 使用pytorch实现LSTM自动AI作诗(藏头诗和首句续写)| 第6例
  • Linux的开发工具
  • Cadence Allegro Vertex功能介绍使用方法Vertex与Slide的区别图文教程
  • Qt5开发从入门到精通——第九篇六节( Qt5 文件及磁盘处理—— 监视文件和目录变化)
  • 接收节点无线广播发送的数据,并printf打印出来(含核心代码)_物联网挑战赛第四届第一题
  • 【CSDN:国庆活动】——“问答”里的成长记录
  • WEB安全之DIV CSS基础(四):三种定位和堆叠顺序
  • C++ -------- 类型转换
  • 【youcans 的图像处理学习课】11. 形态学图像处理(中)
  • 大二数据库实验-MySQL语句(Employee、Department、Salary)
  • [Vue CLI 3] 配置解析之 css.extract
  • CSS 三角实现
  • css系列之关于字体的事
  • k8s 面向应用开发者的基础命令
  • Markdown 语法简单说明
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python3爬取英雄联盟英雄皮肤大图
  • spring学习第二天
  • SQLServer插入数据
  • webgl (原生)基础入门指南【一】
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 记一次删除Git记录中的大文件的过程
  • 京东美团研发面经
  • 利用jquery编写加法运算验证码
  • 聊聊sentinel的DegradeSlot
  • 如何解决微信端直接跳WAP端
  • 学习ES6 变量的解构赋值
  • 中文输入法与React文本输入框的问题与解决方案
  • 阿里云服务器如何修改远程端口?
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #1015 : KMP算法
  • (二)构建dubbo分布式平台-平台功能导图
  • (论文阅读40-45)图像描述1
  • (算法)Game
  • (万字长文)Spring的核心知识尽揽其中
  • (转)大道至简,职场上做人做事做管理
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ****Linux下Mysql的安装和配置
  • **CI中自动类加载的用法总结
  • .naturalWidth 和naturalHeight属性,
  • .net 发送邮件
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .net连接oracle数据库
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • /boot 内存空间不够
  • @WebServiceClient注解,wsdlLocation 可配置
  • [2023年]-hadoop面试真题(一)
  • [Android学习笔记]ScrollView的使用
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)