iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++栈实现逆波兰式的应用
  • 491
分享到

C++栈实现逆波兰式的应用

2024-04-02 19:04:59 491人浏览 泡泡鱼
摘要

目录一.定义二.逆波兰式的意义三.逆波兰式的实现1.方法2.代码实现一.定义 逆波兰式,又称后缀表达式,指的是操作符在其所控制的操作数后面的表达式。 举个例子,1 + 2 * 3 -

一.定义

逆波兰式,又称后缀表达式,指的是操作符在其所控制的操作数后面的表达式。
举个例子,1 + 2 * 3 - 4这个表达式是我们熟悉的中缀表达式,那么其所对应的后缀表达式为:1 2 3 * + 4 -
再来个复杂的例子:1 * (2 + 3) / 5 - 4 / 2其对应的后缀表达式为:1 2 3 + * 5 / 4 2 / -(其中括号由于只是提升表达式优先级的作用,因此不放入后缀表达式中)。

二.逆波兰式的意义

为什么要将看似简单的中缀表达式转换为复杂的逆波兰式,原因就在于这个简单是相对我们人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。

三.逆波兰式的实现

1.方法

(1)中缀表达式转化为后缀表达式

对于给出的中缀表达式,如何将其转化为后缀表达式呢?
第一,若遇到操作数则直接输出/存储。
第二,遇到操作符,若此时栈为空或者操作符优先级高于栈顶,则入栈。
第三,若操作符的优先级低于或者等于栈顶,则出栈直至栈空或者优先级低于该操作符。
第四,遇到'(',其后的所有操作符(直至遇到')')按上述操作入栈或出栈;当遇到')‘时,将'('顶上的所有操作符出栈。

在这里插入图片描述

(2)由后缀表达式计算结果

第一,遇到操作数则入栈。
第二,遇到操作符则将栈顶的两个操作数出栈,其中第一个数为右操作数,第二个数为左操作数。
第三,计算结果并将计算的结果入栈。
第四,最后栈顶的结果即为所计算的结果。

在这里插入图片描述

2.代码实现


#include <iOStream>
#include <string>
#include <stack>
#include <vector>
using namespace std;

string trans(string& s)
{
	string operand;
	stack<char> Operator;
	int flag = 0;//记录括号优先级
	for (const auto& e : s)
	{
		if (e == '(')
		{
			Operator.push(e);
			flag = 1;
			continue;
		}
		if (e == ')')
		{
			flag = 0;
			while (Operator.top() != '(')
			{
				operand.push_back(Operator.top());
				Operator.pop();
			}
			Operator.pop();
			continue;
		}
		//操作符
		if (e == '+' || e == '-' || e == '*' || e == '/')
		{
			if (flag == 1)
			{
				if (Operator.top() == '(')
				{
					Operator.push(e);

				}
				else if ((e == '*' || e == '/') && (Operator.top() == '+' || Operator.top() == '-'))
				{
					Operator.push(e);
				}
				else//操作符的优先级低于或等于栈顶操作符则出栈,直至遇到'('
				{
					while (Operator.top() != '(')
					{
						operand.push_back(Operator.top());
						Operator.pop();
					}
					Operator.push(e);
				}
			}
			else if (Operator.empty())//栈空就入栈
			{
				Operator.push(e);
			}
			//操作符的优先级高于栈顶操作符,入栈
			else if ((e == '*' || e == '/') && (Operator.top() == '+' || Operator.top() == '-'))
			{
				Operator.push(e);
			}
			else//操作符的优先级低于或等于栈顶操作符则出栈,直至栈空或者优先级高于栈顶操作符
			{
				while (!Operator.empty())
				{
					operand.push_back(Operator.top());
					Operator.pop();
				}
				Operator.push(e);
			}
		}
		//操作数
		else
		{
			operand.push_back(e);
		}
	}
	while (!Operator.empty())
	{
		operand.push_back(Operator.top());
		Operator.pop();
	}
	return operand;
}

int evalRPN(const string& s)
{
	stack<char> operand;
	int left = 0, right = 0;
	for (const auto& e : s)
	{
		if (e == '+' || e == '-' || e == '*' || e == '/')
		{
			switch (e)
			{
			case '+':
				right = operand.top();
				operand.pop();
				left = operand.top();
				operand.pop();
				operand.push(left + right);
				break;
			case '-':
				right = operand.top();
				operand.pop();
				left = operand.top();
				operand.pop();
				operand.push(left - right);
				break;
			case '*':
				right = operand.top();
				operand.pop();
				left = operand.top();
				operand.pop();
				operand.push(left * right);
				break;
			case '/':
				right = operand.top();
				operand.pop();
				left = operand.top();
				operand.pop();
				operand.push(left / right);
				break;
			}
		}
		else//操作数
		{
			operand.push(e - '0');
		}
	}
	return operand.top();
}

int RPN(const string& str)
{
	//1.中缀表达式转化为后缀表达式
	string s(str);
	s = trans(s);
	//2.后缀表达式计算答案
	return evalRPN(s);
}

int main()
{
	string s("1*(2*3+5)/5-4/2");
	int ret = RPN(s);
	cout << "ret:" << ret << endl;
	return 0;
}

结果:

在这里插入图片描述

到此这篇关于c++栈实现逆波兰式的应用的文章就介绍到这了,更多相关C++ 逆波兰式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++栈实现逆波兰式的应用

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++栈实现逆波兰式的应用
    目录一.定义二.逆波兰式的意义三.逆波兰式的实现1.方法2.代码实现一.定义 逆波兰式,又称后缀表达式,指的是操作符在其所控制的操作数后面的表达式。 举个例子,1 + 2 * 3 -...
    99+
    2024-04-02
  • C语言实现逆波兰式实例
    复制代码 代码如下:#include<stdio.h>#include<string.h> typedef struct{char s[20][20];int...
    99+
    2022-11-15
    C语言 逆波兰式
  • C++实现LeetCode(150.计算逆波兰表达式)
    [LeetCode] 150.Evaluate Reverse Polish Notation 计算逆波兰表达式 Evaluate the value of an arithmeti...
    99+
    2024-04-02
  • C++实现逆波兰表达式的例题详解
    目录1. 题目描述2. 解题思路3. 动图演示4. 代码实现1. 题目描述 2. 解题思路 逆波兰表达式由波兰的逻辑学家卢卡西维兹提出,它的特点是:没有括号,运算符总是放在和它相关...
    99+
    2022-12-21
    C++实现逆波兰表达式 C++ 逆波兰表达式
  • Java实现简易计算器(逆波兰表达式)
    本文实例为大家分享了Java实现简易计算器的具体代码,供大家参考,具体内容如下 程序的运行环境为Windows10 ,编译环境为IDEA。 计算器有以下功能和要求:能够计算复杂表达式...
    99+
    2024-04-02
  • c语言逆波兰表达式求值的方法
    本篇内容主要讲解“c语言逆波兰表达式求值的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言逆波兰表达式求值的方法”吧!题目根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *...
    99+
    2023-06-19
  • 逆波兰表达式如何在Java项目中实现
    本篇文章给大家分享的是有关逆波兰表达式如何在Java项目中实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。逆波兰表达式定义:传统的四则运算被称作是中缀表达式,即运算符实在两个...
    99+
    2023-05-31
    java 逆波兰表达式 ava
  • C语言中用栈+队列实现队列中的元素逆置
    下面举例代码: 提到的Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法 #include<stdio.h> #define MaxSize 10 typedef ...
    99+
    2024-04-02
  • 怎么用C语言实现链式栈
    这篇文章给大家分享的是有关怎么用C语言实现链式栈的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。堆栈的基本概念堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入,而后者则是删...
    99+
    2023-06-22
  • 用C语言实现链式栈介绍
    目录堆栈的基本概念常见的栈有顺序栈和链式栈- 链式栈的C代码实现代码运行效果堆栈的基本概念 堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入...
    99+
    2024-04-02
  • C#中怎么实现顺序栈和连式栈
    这篇文章将为大家详细讲解有关C#中怎么实现顺序栈和连式栈,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。线性聚集基础在数据结构层次中***层次的抽象是一个聚集,在这个聚集分为两个大类;***类...
    99+
    2023-06-17
  • c++显式栈实现递归介绍
    目录前言1. 递归2. 显式栈实现的思路3. 代码解析前言 在大学的课上老师有教过,也就是用循环来实现递归,现在自己回顾一下并且做一下记录。 1. 递归 假设有函数A, 和函数B, ...
    99+
    2024-04-02
  • c++显式栈如何实现递归
    本篇文章为大家展示了c++显式栈如何实现递归,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言在大学的课上老师有教过,也就是用循环来实现递归,现在自己回顾一下并且做一下记录。1. 递归假设有函数A,...
    99+
    2023-06-26
  • C#中逆变的实际应用场景详解
    目录前言协变的应用场景逆变的应用场景讨论总结前言 早期在学习泛型的协变与逆变时,网上的文章讲解、例子算是能看懂,但关于逆变的具体应用场景这方面的知识,我并没有深刻的认识。本文将在具体...
    99+
    2024-04-02
  • C++实现栈与分析栈的知识点
    目录一、栈的概念二、栈的基本组成和操作三、栈元素的存储方式四、C++实现静态栈(1)栈类的设计(1)isEmpty()判断是否为空(2)isFull()判断是否已满(3)push()...
    99+
    2024-04-02
  • C++详解链栈的实现
    目录链栈简述示例代码开发环境运行结果注意链栈简述 链栈从概念上看是链表和栈的结合,含有栈先进后出的特性,也具有链表的动态增加节点的特性,这里相当于在链表的基础上增加只能从一端操作,且...
    99+
    2024-04-02
  • 栈的应用-综合计数器的实现
    目录 前言 一、思路分析 二、代码实现 总结 前言 在实现综合计数器之前,大家应该先了解一下什么是前中后缀表达式 前缀、中缀和后缀表达式是表示数学表达式的三种不同方式。 前缀表达式(也称为波兰式或前缀记法):操作符位于操作数之前。例...
    99+
    2023-09-25
    java 数据结构
  • C++栈的数组实现代码
    栈的抽象数据结构。栈的成员函数需要包括这几个基本的函数:initializeStack(),isEmptyStack(),isFullStack,push(),pop(),top()...
    99+
    2024-04-02
  • C语言递归实现字符串逆序的方式详解
    C语言实现字符串逆序,具体内容如下所示: 一、迭代的方式实现 贴上代码:迭代的方式实现 '//字符串逆序:不可用字符串操作函数' #include <stdio.h&g...
    99+
    2024-04-02
  • C++实现OpenCV方框滤波的代码
    一、方框滤波    方框滤波是均值滤波的一种形式。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和的均值,而在方框滤波中,可以自由...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作