利用两个栈求解算数表达式的源代码

C++ 数据结构 算数表达式求值——栈存储 数据结构实习——算术表达式求值 一、实习题目及要求 1、题目:算术表达式求值 2、要求: (1)正确解释表达式; (2)符合四则运算规则: (3)先乘除、后加减; (4)从左到右运算; (5)先括号内,后括号外; (6)输出最后的计算结果。 二、问题描述 1、对一个合法的中缀表达式求值。 2、假设表达式只包含+、-、*、/ 四个双目运算符,并且允许有括号出现,运算符本身不具有二义性。 三、问题分析... 阅读详情

说明:

1、只包含了小括号(),和+、-、*、/二元操作符的四则运算

2、求它更通用的求解方法可以参考递归求解、通过表达式树求解的方法

 

#include <cctype>
#include <map>
#include <stack>
#include <string>
#include <iostream>

using namespace std;

//弹出操作符栈的一个操作符,弹出操作数栈的一个操作数,计算结果
void Compute(stack<char> &operators, stack<double> &operands)
{
	double op2 = operands.top();
	operands.pop();
	double op1 = operands.top();
	operands.pop();
	char optr = operators.top();
	double result;
	switch(optr)
	{
	case '+':
		result = op1 + op2;
	case '-':
		result = op1 - op2;
	case '*':
		result = op1 * op2;
	case '/':
		result = op1 / op2;
	}
	operands.push(result);
	operators.pop();
}

//通过操作符栈和操作数栈求解表达式,表达式正确返回true,结果存在result里,错误返回false
bool ComputeExpr(const string &expr, map<char,int> &priority_tbl, double &result)
{
	stack<double> operands;//操作数栈
	stack<char> operators;//操作符栈

	string inner_expr(expr + '$');//加个哨兵
	operators.push('#');//哨兵

	for(int i = 0; i < inner_expr.length(); ++i)
	{
		char ch = inner_expr[i];
		if(isdigit(ch))//操作数直接入操作数栈
			operands.push(ch - 0x30);
		else//操作符
		{
			switch(ch)
			{
			case '(':
				operators.push(ch);
				break;
			case ')': //求解当前最内部的括号表达式
				while(operators.top() != '(')
				{
					if(operators.top() == '#' || operands.size() < 2)
						return false;
					Compute(operators, operands);
				}
				operators.pop();
				break;
			case '$': //此时,正确表达式已经不存在括号了,计算
				while(operators.top() != '#')
				{
					if(operands.size() < 2)
						return false;
					Compute(operators, operands);
				}
				if(operands.size() == 1)
				{
					result = operands.top();
					return true;
				}
				return false;
			default: //一般的二元操作符求解
				while(priority_tbl[ch] <= priority_tbl[operators.top()])
				{
					if(operands.size() < 2)
						return false;
					Compute(operators, operands);
				}
				operators.push(ch);
			}
		}
	}
}

int main(int argc, char *argv[])
{
	const string expr_str("((5+6)*7/(2-9)*9)+5");

	//优先级表,数字越大,优先级越高
	map<char, int> priority_tbl;
	priority_tbl.insert(make_pair('+',2));
	priority_tbl.insert(make_pair('-',2));
	priority_tbl.insert(make_pair('*',3));
	priority_tbl.insert(make_pair('/',3));
	priority_tbl.insert(make_pair('(',1));
	priority_tbl.insert(make_pair('#',0));

	double result;

	bool ret = ComputeExpr(expr_str, priority_tbl, result);

	if(ret)
	{
		cout << expr_str << " = " << result << endl;
	}
	else
	{
		cout << "表达式错误!" << endl;
	}

	return 0;
}


 

表达式求值【C语言实现】数据结构实验 表达式求值【C语言实现】数据结构实验 实验内容 表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 实验要求 基本要求:以字符序列的形式从键盘输入语法正确的,不含变量的整型表达式。利用教科书表 3.1 给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例 3.1 演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。 实现提示 1 设置运算符栈和运算数栈辅助分析算符优先关系。 2 在读入表达式的字符序列的同时 阅读详情

相关推荐

利用两个栈求表达式求值

利用两个栈求表达式的值,一个是字符栈,一个是数字栈。

“双栈”解决表达式求值问题

表达式求值问题是什么? 就是给定一个字符串给你要求求出结果,如“1+3*2-3”,结果为4. 我们来看以下几个题目。 1.基本计算器 2.基本计算器Ⅱ 我们可以发现其实这都是表达式求值问题,只不过题目的表达式形式不一,是只有+,-;还是+,-,*,\,^都有;甚至包括(),还有的可能有自定义计算。 那么对这类表达式求值问题有没有一个统一的方法求值呢?是有滴!掌握了这个方法之后无论是啥表达式求值都莫得问题了撒。 //以下方法总结自力扣一位大佬 双栈解决「通用表达式」问题的通用解法 对于「表达式计算」这一类

GOV_D的博客 890

算术表达式求值源码+实验报告

代码可靠完整,个人手写实现,包括小数计算,下面是测试用例: //10*8^2+16.3+5*(5.2*5+3.01)/4-(-10)+0.1000060+4.00416-40 = 666.666666 //100+(-100)-(-10^2) = 100 //(((2016-2017+(((2015-2014)))))) = 0 //-1+(((((((((1^0))))))))+100^2 = 0

使用两个栈来完成算数表达式求值

栈(stack) 后进先出(FILO)策略的数据结构。 public class Evaluate { public static void main(String[] args) { System.out.println(evaluate()); } /** * 使用两个栈来完成表达式运算 * 表达式由括号、运算符、和操作数...

骆超 1277

数据结构:栈的应用-算术表达式求解-后序表达式法

将常见的中序表达式形式的四则运算算术表达式转换成电脑易于理解的后序表达式形式,并求解整个算术表达式的值。

国产FPGA开发实战:紫光同创编程软件中的约束文件详解与常见问题

本文详细解析了紫光同创FPGA编程软件中约束文件的关键配置技巧与常见问题。通过基础架构解析、时钟约束实践、物理约束调控及典型问题排查指南,帮助开发者高效掌握国产FPGA开发中的约束文件应用,提升开发效率与设计稳定性。

gin88的博客 903

利用双栈计算表达式

struct Operator{OperatorType OpType;int Value;    //如果是操作数则为数值,若是运算符则为优先级表中下标};stack        OPND;                        //运算数栈stack        OPTR;                            //运算符栈vector    g_vecExpression;        //表达式向量char OpPriority[7][7] = {{’>’,'>’,'’

Blog of pokey 1135

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7475

双栈实现简单表达式求值

双栈实现简单表达式求值 双栈实现表达式的求值是使用栈的一个经典例子,它使用一个栈来保存操作符,另外一个栈来保存操作数。 算数表达式由括号、运算符和操作数组成,双栈求值实现过程如下: 1、将操作数压入操作数栈 2、将运算符压入运算符栈 3、忽略左括号 4、在遇到右括号时,弹出一个运算符,再弹出运算符所需的操作数,并将运算符和操作数运算的结果存入操作数栈。 下面为实现一个保留括号(即不省...

is_Javaer的博客 1596

Windows10下安装VMware16虚拟机

由于本人系统为Windows 10 家庭中文版,无法安装Linux子系统WSL,虽然网上也有强制安装的方法,但为保险起见,还是把之前的VMware虚拟机重新进行安装,并浅浅记录一下安装过程。

沉香best的博客 862

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | 引入GCConv卷积改进YOLO26,含GCC3k2二次创新,能够捕捉更加丰富和复杂的特征信息,助力高效涨点

本文提出了一种基于GCConv模块的YOLO26目标检测模型改进方案。GCConv模块通过多路径结构增强特征学习能力,在训练阶段采用垂直多卷积和水平多路径配置,推理时重参数化为单一3x3卷积,显著提升推理速度而不损失性能。实验表明,该模块在复杂场景和多尺度目标检测任务中表现优异,特别适合资源受限的实时应用场景。文章详细介绍了GCConv的网络结构、核心代码实现、YAML配置文件修改方法,并提供了两种改进方案(GCConv和GCC3k2)的具体配置指导。

Ai缝合怪、助力小伙伴高效发论文 316

双栈计算算术表达式

1.介绍 算术表达式的计算,是比较常见的问题,但这个问题的背后隐藏着栈的思想。 这里就介绍使用两个栈来计算表达式的方法。 2. 算法 2.1 定义: a) 建立两个栈: 一个是数据栈dataStak,用于存放数据; 一个是符号栈operatorStack,用于存放运算符; b) 建立运算符号之间的优先级表,用于比较两个符号之间的优先级; 优先级定义为三种运算结果:&gt...

weixin_30414245的博客 186

CGAL AlphaShape算法(自适应Alpha值,二维版本)

CGAL AlphaShape算法(自适应Alpha值,二维版本)

dayuhaitang1的博客 2321

数据结构与算法-栈的应用(一)-算数表达式计算

栈的应用-算数表达式 题目描述: 读入一个只包含 +,-,*,/的非负整数计算表达式,计算该表达式的值 输入: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符 之间用一个空格分隔,没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 输出: 对每个测试用例输出一行,即该表达式的值,精确到小数点后两位 样例输入: 1 + 2 4 + 2 * 5 -...

肖睿的博客 1414

RV1126笔记二十七:MetaRTC6移植

MetaRTC6移植

6038

PSM倾向性评分分析介绍、spss进行倾向性评分分析示例

PSM倾向性评分分析介绍、spss进行倾向性评分分析示例

statistics+insight+vista+power 1481

C语言利用栈计算算式(表达式)

一般普通计算器都是计算两个数相乘,除,加,减,即时计算出答案,而并不能实现输入一个简单数学算式并进行计算得出结果。对于很多人来说,没有合适的方法计算一个算式,那么我们其实也可以通过栈来实现计算算式。 通过栈来实现? PS:如何实现模拟栈 https://blog.youkuaiyun.com/ZouHuiDong/article/details/90343026 假如我们有一个算式:20 - 5 + 12 ...

汇东的博客 1万+

机器学习特征选择-t检验

在特征选择的过程中通过计算检验统计量值,比较特征之间的统计量的大小,并降序排列,选取统计值较高的特征,从而起到去除差别小的特征(此差别小的特征难以区分不同的额类别)的目的。 以t检验(Student's t test)为例: 假设检验 通过比较两类样本的随机变化,通过计算其p值决定是否拒绝零假设,也即是说:通过计算p值,若p值小于某一阈值则认为两个样本具有显著差异,两个样本是不同的,此时拒绝...

heda3的博客 6700

C语言-用栈实现表达式求值(顺序栈)

函数目录: 栈的基本操作: 创建栈并初始化(create) 入栈(push_in) 出栈(pop_out) 取栈顶元素(GetTop) 优先级函数(Precede) 求值函数(Operate) 判断操作符函数(In) 表达式求值函数(evaluateExpression) 其他:操作符栈(OPTR),操作数栈(OPND) 谈谈我遇到的问题: 1.该选择数字栈还是字符栈? 运算数是整型...

Attract's Blog 3万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于栈的后缀算术表达式求值

@[topic] 题目描述:输入一个中缀算术表达式,将其转换为后缀表达式,然后对后缀表达式进行求值。运算符包括+ - * / =,参与运算的为小于10的自然数。 功能要求及说明: (1) 输入要求:可输入多组测试数据,每组数据对应一个算术表达式,当输入’=’ 时表示输入结束。 (2) 输出要求:对每组数据输出2行,第1行为中缀表达式对应的后缀式,第2行为 后缀式求值的结果 (3) 输入样例: 9+...

sadbird1729的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

双栈实现算数表达式

双栈算术表达式求值算法 源代码是java实现的,先把他改成cpp实现。 原理大家应该都懂,就是两个栈,一个保存读取式子的符号,遇到“(”不读,遇到“)”进行操作,其他符号保存。另一个栈保存每次读到的数字。 因为每次读到)时候,都要进行一次操作,而操作对象就是最小的那对括号里面的数字,也就是第二个栈顶保存的两个元素,所以可操作。 #include #include #include

Juice_p的博客 1291

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

实验项目一 支持算数表达式求解的计算器

实验项目一 支持算数表达式求解的计算器。

m0_57888607的博客 226

算术表达式求值演示

源代码 #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define STACKINCREMENT 5 #define STACK_INIT_SIZE 10 typedef char SElemType; typedef int Status; typedef struct{ SEle...

qq_45722185的博客 4785

栈解决简单的后缀表达式运算

栈实现后缀表达式转化和计算 利用栈的先进后出特性可以方便地将中缀表达式转换为后缀表达式: 转换函数定义 void trans(char* exp, char postexp[]) exp为输入的算术表达式字符串,postexp为结果字符数组。此算法还需要一个运算符栈用来转换所有的运算符。 对于输入的字符串依次读取,如果读入的是数字,则直接读入postexp数组,并在读取完一个数字后加上‘#’表示一...

35.5 538

c语言中缀表达式求值_[源码和文档分享]C语言的基于栈实现的表达式求值

一、目的理解中缀表达式求值的过程理解中缀转后缀表达式求值的过程掌握堆栈的应用二、问题描述缀表达式,其中包含括号,加减乘除,乘方等运算,利用中缀表达式,对表达式分析并求值入的中缀表达式转换为后缀形式,显示后缀形式,并通过后缀形式求值三、数据结构//运算符结构体typedef struct{char OPname; //存储运算符int inOP; //存储栈内级别int outOP; //存储栈外级...

weixin_39605997的博客 176

简单的算数表达式解析器

学习了编译原理的scan和parsing之后写了一个简单的算数表达式解析器,输入为算数表达式,输出结果,支持括号和浮点数运算。首先画出DFA,根据状态间的转移求出getToken函数。然后求出EBNF: -> { } -> + | - -> { } -> * -> ( ) | number并实现exp、term、factor函数。源代码:#include stdio.h>#i

放飞梦想 1057
上一篇: lua和c/c++互相调用实例分析
下一篇: epoll的一个demo,备忘(epoll+线程池)
执迷的信徒
博客等级 码龄16年 245粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值