返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++表达式求值详解
  • 547
分享到

C++表达式求值详解

2024-04-02 19:04:59 547人浏览 安东尼
摘要

目录一.细节处理:1.注意负数 因此要进行字符串预处理2.考虑除数为03.原字符串再加上一个定界符 '#'4.优先级:二.知识要点:三.完整源码:四.测试结果:总结一.细节处理: 1

一.细节处理:

1.注意负数 因此要进行字符串预处理


string fORMat(string str) 
{
	int len = str.length();
	for (int i = 0; i < len; i++)
	{
		if (str[i] == '-')
		{
			if (i == 0) { str.insert(0, 1, '0'); }//处理-3*2+1情况
			else if (str[i - 1]=='(') { str.insert(i, 1, '0'); }//处理(-3*4+1)情况
		}
	}
	return str;
}

2.考虑除数为0


                    case '/':
					if (0 != y) { res = x / y; }
					else { cout << "非法表达式"; return -1; }
					break;

3.原字符串再加上一个定界符 '#'


str=str+'#'

4.优先级:

1."("未入栈前为3 入栈后为0 2.”)"和"#"为0 3.”+" "-"为1 4.”*"和"/"为2

二.知识要点:

中缀表达式转为后缀表达式

1. 首先设置存储运算符和存储操作数两个栈 即Symbol[N]和Num[N]且分别对应top2,top1


top1=-1 Symbol[0]='#' //运算符栈设置定界符 top2=0

2.入栈和出栈的规则 字符串为str

一.若str[i]>='0&&str[i]<='9',则入操作数栈并继续扫描以一个字符 即Num[++top1]=str[i++]-'0';

二.否则 将当前字符str1与运算符栈的栈顶元素str2进行优先级比较 ,自写比较函数

例如: str1==‘+' 则若str2==# ,(,) 则返回1 说明str1比str2优先级高

1. 此时若str1优先级大于str2 则将str1入运算符栈并继续扫描 即 Symbol[++top2]=str[i++]

2.优先级相等则返回0 此时将运算符栈顶元素弹出,并继续扫描下一个字符即 top2-- i++

3.若str1优先级小于str2返回-1,此时将运算符栈顶元素弹出 即op=Symbol[top2--]

并弹出操作数栈的两个元素 即y=Num[top1--],x=Num[top1--] 之后进行计算操作

三.最后 return Num[top1]

三.完整源码:


#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
class Expression
{
public:
	Expression(string str);
	~Expression();
	int Compute();
private:
	int Comp(char str1, char str2);
	string str1;
};
Expression::Expression(string str)
{
	this->str1 = str + '#';//以定界符开头
}
Expression :: ~Expression() {}
//将中缀表达转为后缀表达
int Expression::Compute()
{
	int Num[100], Symbol[100];//定义存操作数和运算符的两个栈
	int i, k, x, y, res;
	char op;
	Symbol[0] = '#';
	int top1 = -1, top2 = 0;
	for (i = 0; str1[i] != '\0';)
	{
		if (str1[i] >= '0' && str1[i] <= '9') { Num[++top1] = str1[i++] - '0'; }
		else {//非操作数就比较运算符优先级
			int cmp = Comp(str1[i], Symbol[top2]);
			if (cmp == 1) { Symbol[++top2] = str1[i++]; }//将运算符入栈 并接着扫描下一个字符
			else if (cmp == 0) { --top2; i++; }//优先级相等 弹栈 并接着扫描下一个字符
			else {//优先级低 继续处理当前运算符
				y = Num[top1--];//后面的数要先弹出来 才不会算反
				x= Num[top1--];
				op = Symbol[top2--];
				switch (op)
				{
				case '+':
					res = x + y;//将运算结果入栈
					break;
				case '-':
					res = x - y;
					break;
				case '*':
					res = x * y;
					break;
				case '/':
					if (0 != y) { res = x / y; }
					else { cout << "非法表达式"; return -1; }
					break;
				default:break;
				}
				Num[++top1] = res;
			}
		}
	}
	return Num[top1]; 
}
string format(string str) 
{
	int len = str.length();
	for (int i = 0; i < len; i++)
	{
		if (str[i] == '-')
		{
			if (i == 0) { str.insert(0, 1, '0'); }//处理-3*2+1情况
			else if (str[i - 1]=='(') { str.insert(i, 1, '0'); }//处理(-3*4+1)情况
		}
	}
	return str;
}
int main()
{
	string str;
	int n = 3;
	while (n--)
	{
		cout << "请输入一个表达式: " << endl;
		cin >> str;
		str = format(str);
		Expression E(str);
		int result = E.Compute();
		cout << "表达式的值的是: " << result << endl;
	}
	return 0;
}
int Expression::Comp(char str1, char str2)//当前字符元素和栈顶运算符优先级比较
{
	//1代表 str1优先级大于str2 0 代表相等 -1代表小于
	switch (str1)
	{
	case'+':case'-': 
		if (str2 == '#'||str2==')'||str2=='(') { return 1; }//左括号入队列后优先级变为0
		else { return -1; }
		break;
	case'*':case'/':
		if (str2 == '*' || str2 == '/') { return -1; }
		else  { return 1; }
		break;
	case'(':
		return 1;
		break;
	case')':
		if (str2 == '(') { return 0; }
		else if(str2 == '#') { return 1; }
		else { return -1; }
		break;
	case'#':
		if (str2 == '#') { return 0; }
		else { return -1; }
		break;
	default: break;
	}
}

四.测试结果:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++表达式求值详解

本文链接: https://lsjlt.com/news/137574.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++表达式求值详解
    目录一.细节处理:1.注意负数 因此要进行字符串预处理2.考虑除数为03.原字符串再加上一个定界符 '#'4.优先级:二.知识要点:三.完整源码:四.测试结果:总结一.细节处理: 1...
    99+
    2024-04-02
  • python四则运算表达式求值示例详解
    目录四则运算表达式求值思路说明算法步骤代码四则运算表达式求值 思路说明 使用双栈来实现——存放数值的栈 nums 与存放运算符的栈&nbs...
    99+
    2024-04-02
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2024-04-02
  • 四则运算表达式求值
    四则运算表达式求值两个要点1.中缀表达式转后缀表达式2.后缀表达式求值中缀表达式转后缀表达式从左到右遍历中缀表达式的每个数字和符号.若是数字就输出,成为后缀表达式的一部分.若是符号则判断其与栈顶符号的优先级,是右括号或者优先级低于等于栈顶符...
    99+
    2023-06-03
  • c语言逆波兰表达式求值的方法
    本篇内容主要讲解“c语言逆波兰表达式求值的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言逆波兰表达式求值的方法”吧!题目根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *...
    99+
    2023-06-19
  • 初始C语言(6)——详细讲解表达式求值以及其易错点
    系列文章目录  第一章 “C“浒传——初识C语言(1)(更适合初学者体质哦!)  第二章 初始C语言(2)——详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言(3)——特别详细地介绍函数  第四章 初始C语言(4)——详细...
    99+
    2023-09-22
    c语言 开发语言
  • C++ 如何使用栈求解中缀、后缀表达式的值
    目录1. 前言2. 中缀表达式2.1 求值流程2.2 演示表达式4*6^(3+3*3-2*3)-8 的求值过程当2.3 编码实现3.后缀表达式4. 中缀转后缀表达式4.1 流程演示4...
    99+
    2022-11-13
    C++中缀 后缀表达式的值 C++ 栈求解表达式的值
  • C#3.0中Lambda表达式详解
    在C#2.0中,微软给我们带来了一些新的特性,例如泛型,匿名委托等。然而,这些新的特性多多少少会给人一种从别的语言中“抄”来的感觉(例如泛型类似C++的模板,一些特性类似Java中的...
    99+
    2022-11-15
    C# Lambda
  • 如何使用 C++ lambda 表达式执行延迟求值?
    如何使用 c++++ lambda 表达式执行延迟求值?使用 lambda 表达式创建延迟求值的函数对象。延迟计算推迟到需要时才执行。仅当需要时才计算结果,提高性能。 如何使用 C++...
    99+
    2024-04-17
    c++ lambda
  • java算术表达式求值怎么写
    要求解一个算术表达式的值,可以使用栈来实现。具体步骤如下: 创建两个栈,一个用于存储操作符(operatorStack),一个用于...
    99+
    2023-10-23
    java
  • C#正则表达式与HashTable详解
    目录1、正则表达匹配规则转义字符限定字符分组()2、C#中正则表达式构建与匹配正则表达式的替换正则表达式拆分HashTable概述及元素添加Hashtable遍历Hashtable元...
    99+
    2024-04-02
  • C++实现中缀表达式转化为后缀表达式详解
    目录1.题目描述2.输入输出3.解题思路4.样例解析 5.代码实现5.1.优先级确认5.2.转换函数1.题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运...
    99+
    2024-04-02
  • Lambda表达式详解
    Lambda表达式 1. 为什么使用lambda表达式2. 入门案例3. lambda表达式组成4. lambda表达式使用4.1 语法格式一4.2 语法格式二4.3 语法格式三4.4 语法格...
    99+
    2023-09-01
    java jvm 算法
  • JavaLambda表达式详解
    Java Lambda表达式是JDK8引入的,是一个比较重要的特性 Lambda表达式简介 Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数...
    99+
    2023-02-18
    Java Lambda表达式详解 Java Lambda表达式创建线程 Java Lambda表达式的语法 Java lambda遍历List集合 Java lambda过滤String
  • C++三元表达式详情
    if-else语句非常常用,但在进行一些简单逻辑判断的时候,会显得有些不太简洁。特别是在初始化的时候,比如我们有一个变量,某种情况下赋值成a,另外的情况下赋值成b。 使用if-els...
    99+
    2024-04-02
  • C#正则表达式Regex用法详解
    目录一、正则表达式应用举例1、C#校验合法性:2、C#限制输入3、正则表达式匹配闭合HTML标签(支持嵌套)1、分组构造2、举例:二、.Net正则表达式测试器1、功能简介2、下载与安...
    99+
    2024-04-02
  • C++ 正则表达式的应用详解
    目录一、为什么要学正则表达式C++string处理:二、正则程序库(regex)正则文法:正则库:匹配(Match)搜索(Search)替换(Replace)一、为什么要学正则表达式...
    99+
    2024-04-02
  • vue基础语法之插值表达式详解
    目录一、vscode插件介绍二、插值表达式介绍三、插值表达式示例1四、插值表达式示例2五、插值表达式注意点六、插值表达式补充总结一、vscode插件介绍 在我们演示插值表达式之前,我...
    99+
    2024-04-02
  • C#表达式树讲解
    表达式树的概念 表达式树的创建有 Lambda法 和 组装法。学习表达式树需要 委托、Lambda、Func<> 基础。...
    99+
    2024-04-02
  • python四则运算表达式求值的方法
    这篇文章主要讲解了“python四则运算表达式求值的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python四则运算表达式求值的方法”吧!四则运算表达式求值思路说明使用双栈来实现&am...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作