有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

2023-11-14

有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

在前一天已经利用栈完成2进制到8进制的转换。但是栈的应用方面还有很多,本次我将讲解如何计算后缀表达式的结果。
在这里插入图片描述

解题思路

后缀表达式(PRN)也叫逆波兰表达式,是在计算机中用于求值的一种方式,其求值过程可以用到栈来辅助存储。
在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示,如1+2。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示,如12+。
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
中缀表达式转换到后缀表达式公式
假定待求值的后缀表达式为:1 2 + 5 3 6 + * + 7 - ,其实际上为1+2+5*(3+6)-7。其求值过程如下:
1、遍历表达式,遇到1和2,压入栈中。此时栈如图所示:

示例1
2、接着读到+号,弹出2与1,执行加法运算,得到3,再次入栈。此时栈如图所示:

示例2
3、遇到5、3和6,压入栈中。此时栈如图所示:

示例3
4、接着读到+号,弹出6与3,执行加法运算,得到9,再次入栈。此时栈如图所示:

示例4
5、接着读到*号,弹出9与5,执行加法运算,得到45,再次入栈。此时栈如图所示:

示例5
6、接着读到+号,弹出45与3,执行加法运算,得到48,再次入栈。此时栈如图所示:

示例6
7、遇到7,压入栈中。此时栈如图所示:

示例7
8、接着读到-号,弹出7与48,执行加法运算,得到41,再次入栈。
9、由于表达式已结束,读出栈内的最后一个元素,就是结果41。

实现代码

#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10
typedef double Ele;

struct stack
{
	Ele* top;
	Ele* bottom;
	int stacksize;
};

typedef struct stack* Stack;

void init(Stack s){			//初始化栈
	Ele *p;
	p = (Ele*)malloc(Maxsize * sizeof(Ele));
	if (p == NULL){
		printf("error");
		exit(1);
	}
	s->top = s->bottom = p;
	s->stacksize = Maxsize;
}

void PUSH(Stack s, Ele data){		//入栈
	int length;
	length = s->top - s->bottom;
	if (length >= s->stacksize){
		s->bottom = (Ele*)realloc(s->bottom,(s->stacksize + Maxsize) * sizeof(Ele));
		if (s->bottom == NULL){
			printf("内存分配失败\n");
			exit(1);
		}
		s->stacksize = s->stacksize + Maxsize;//更新stacksize的值
		s->top = s->bottom + length; //更新top的值
	}
	*(s->top) = data;
	s->top++;
}
Ele POP(Stack s){					//出栈
	Ele num;
	if (s->top == s->bottom){
		printf("栈内没有元素了!\n");
		exit(1);
	}
	s->top--;
	num = *(s->top);
	return num;
}

int main(){
	struct stack s;			//定义栈
	char c = 0,str[10];		//c用于从键盘获取字符,str用于存储每一轮输入的数字,之后会转化成double类型
	Ele a1, a2, num;		//a1,a2用于栈的运算
	int i = 0;				//temp量


	init(&s);				//初始化栈
	printf("请输入一个算式:");		

	scanf("%c", &c);		//输入一个字符
	while (c != '#')
	{
		while ((c <= '9' && c >= '0') || c == '.'){	//该部分用于获取一个double类型的数字
			str[i++] = c;
			str[i] = '\0';
			if (i >= 10){
				printf("输入数据过大");
				exit(1);
			}
			scanf("%c", &c);
			if (!(c <= '9' && c >= '0') && !(c == '.')){
				a1 = atof(str);						//该函数用于将字符串转化位double
				PUSH(&s, a1);
				i = 0;
				break;
			}
		}
		switch (c)								//判断是否属于加减乘除
		{
		case '+': 
			a1 = POP(&s);
			a2 = POP(&s); 
			PUSH(&s, a2 + a1);
			break;
		case '-': 
			a1 = POP(&s);
			a2 = POP(&s); 
			PUSH(&s, a2 - a1);
			break;
		case '*': 
			a1 = POP(&s);
			a2 = POP(&s); 
			PUSH(&s, a2 * a1);
			break;
		case '/': 
			a1 = POP(&s);
			a2 = POP(&s); 
			PUSH(&s, a2 / a1);
			break;
		case ' ':
			break;
		case '#':
			break;
		default:
			printf("输入符号错误!\n");
			break;
		}
		scanf("%c", &c);
	}
	num = POP(&s);
	printf("%.3f\n", num);

	return 0;
}

GITHUB下载连接

https://github.com/bubbliiiing/Data-Structure-and-Algorithm

希望得到朋友们的喜欢。
有问题的朋友可以提问噢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果 的相关文章

  • JVM 内存模型

    内存划分 java虚拟机按照运行时内存使用区域划分如图 区域 是否线程共享 是否会内存溢出 程序计数器 否 不会 java虚拟机栈 否 会 本地方法栈 否 会 堆 是 会 方法区 是 会 一 程序计数器 Program Counter Re
  • 逆序栈(递归⚠)

    给你一个栈 请逆序这个栈 不能申请额外的数据结构 只能使用递归求解 题解 这道题难点就在于无法申请额外数据结构 可以用两个递归函数实现 第一个递归函数GetBottom 主要用途是将栈底的数据出栈 并返回该数据的值 所以我们可以使用递归让栈
  • Linux 网络协议栈开发(二)—— 二层桥转发基础

    做为网络设备 二层转发是最基本的功能 要想继续学习linux 内核协议栈 必须明白二层转发的流程 这篇文章举例讲一讲二层转发的流程 二层转发是根据报文的目的MAC直接进行转发 转发过程中不用对报文的头部做任何的修改 三层转发是根据报文的ip
  • 数据结构--一个数组实现两个栈

    用一个数组实现两个栈 通常我们会想到以下几种方案 1 奇偶栈 即就是将数组的偶数位置看作一个栈的存储空间 将奇数位置看作另一个栈的存储空间 2 从中间分别向两边展开 即就是将数组的中间位置看作是两个栈的栈底 压栈时栈顶指针分别向两边移动 当
  • 有趣的数据结构算法3——单链表尾插法和头插法的实现

    有趣的数据结构算法3 单链表尾插法和头插法的实现 什么是单链表 头插法的实现 尾插法的实现 头插法实现代码 尾插法实现代码 GITHUB下载连接 以前学习C语言的时候 对于指针 链表什么的是最害怕的 但是现在 什么是单链表 单链表是一种链式
  • 栈、队列的基本概念和操作

    目录 一 栈 stack 了解 1 1 栈的实现和操作 二 队列 queue 了解 2 1 队列的实现与操作 2 2 双端队列 一 栈 stack 了解 概念 栈 stack 有些地方称为堆栈 是一种容器 可存入数据元素 访问元素 删除元素
  • 3分钟弄清楚javascript的堆栈原理

    首先了解一下Javascript的堆栈概念 堆 栈 两者都是存放临时数据的地方 栈 stack 栈的特点是 LIFO 即后进先出 Last in first out 数据存储时只能从顶部逐个存入 取出时也需从顶部逐个取出 比如一个乒乓球的盒
  • 栈实现计算机复杂计算

    package com yg stack author GeQiLin date 2020 2 22 14 14 import jdk nashorn internal ir ReturnNode public class Calculat
  • 数据结构 之 栈【图文详解】

    栈是一种操作受限的线性表只允许从一端插入和删除数据 栈有两种存储方式 即线性存储和链接存储 链表 栈的一个最重要的特征就是栈的插入和删除只能在栈顶进行 所以每次删除的元素都是最后进栈的元素 故栈也被称为后进先出 LIFO 表 每个栈都有一个
  • C++语法基础之栈和队列

    栈 头文件 lt stack gt 实例化 stack在内部默认使用std deque存储数据 但是可以指定使用vector或者list存储数据 示例 std stack
  • 数据结构和算法(4)-----栈

    一 栈的一个实际需求 例如 请输入一个表达式计算式 7 2 2 5 1 5 3 3 点击计算 如下图 请问 计算机底层是如何运算得到结果的 注意不是简单的把算式列出运算 因为我们看这个算式 7 2 2 5 但是计算机怎么理解这个算式的 对计
  • 跨度计算算法

    int FindingSpans int inputArray int spans new int inputArray length for int i 0 i lt inputArray length i int span 1 int
  • LeetCode 20. 有效的括号

    题目链接 https leetcode cn problems valid parentheses C 代码如下 class Solution public bool isValid string s stack
  • 通过栈实现算术表达式的计算

    最近在看数据结构的栈 其中有一节为栈应用到算术表达式的计算 接下来我讲举例说明如何用栈去计算 如有不对的地方 请各位大神指教 1 定义操作符的优先级 作为栈顶操作符时优先级仅高于 作为栈顶操作符时优先级是最高的 和 优先级一样 但是一个作为
  • C++中用两个栈实现一个队列

    想要利用两个栈实现一个队列 首先我们需要搞清楚栈和队列的特性 栈是后进先出 是一个压栈的过程 而队列则是先进先出的一个过程 用两个栈去实现一个队列 该怎样做 首先假如我们有一组数据 7 5 9 2 然后我们需要一个栈 stack
  • 数据结构-线性表之堆栈

    什么是栈 是一种数据结构 能够实现后进先出的一种业务场景 即栈中的元素被处理时 按后进先出的顺序进行 所以栈又叫做后进先出表 LIFO 例子 生活中的叠放在厨房桌子上的碗就是一种栈结构 放的时候只能把碗放在最上面 取的时候只能从最上面开始取
  • 如何将栈中的元素输出

    首先需要写一个出栈函数 得到栈顶的值 才能将其输出 bool Pop SqStack s ElemType e if s gt top 1 return false e s gt data s gt top s gt top return
  • 栈和队列简介

    栈和队列简介 栈和队列是两种常用的数据结构 它们的数据是按线性结构存储的 因此 栈和队列也属于线性表 栈和队列的数据可以存储在一个顺序表里 也可以存储在一个链表里 只要满足线性存储结构就行 只对数据的线性结构有要求 对存储数据的具体结构并不
  • CH3-栈和队列

    文章目录 3 1栈和队列的定义和特点 栈的应用 队列的应用 3 1 1栈的定义和特点 3 1 2队列的定义和特点 3 2案例引入 案例3 1 进制转换 案例3 2 括号匹配的检验 案例3 3 表达式求值 案例3 4 舞伴问题 3 3栈的表示
  • 栈之中缀表达式转后缀表达式

    题目描述 就是把我们平常写的运算表达式换成另外一种表达式 运算符前面两个数字执行相关操作 用图说明一下 比如3 2 gt 3 2 比如3 3 2 gt 3 3 2 再比如 3 3 2 2 3 gt 3 3 2 2 3 程序设计思路 特殊情况

随机推荐

  • 分布式系统全链路监控方案设计

    分布式系统全链路监控方案设计 在分布式系统中 全链路监控系统 跟踪requestid经过了哪些server 方便定位log的位置 能在一定程度上缓解维护压力 下面给出我们团队的架构设计图
  • 【ClickHouse 技术系列】- ClickHouse 中的嵌套数据结构

    前言 本文翻译自 Altinity 针对 ClickHouse 的系列技术文章 面向联机分析处理 OLAP 的开源分析引擎 ClickHouse 因其优良的查询性能 PB 级的数据规模 简单的架构 被国内外公司广泛采用 阿里云 EMR OL
  • Opengles 2.0 错误 called unimplemented OpenGL ES API

    在使用Android进行opengl es进行开发时 可能会出现这个called unimplemented OpenGL ES API错误 图也没绘出来 如果确定你的模拟器或者真机支持opengl es 并且支持相关版本时 采用2 0时报
  • php 七牛上传图片,七牛云如何上传图片

    七牛云上传图片的方法 1 注册七牛云账号 2 创建一个存储空间bucket 创建的时候回送一个临时的测试域名 这个等上传工具类要用到 有效期30天 3 写java工具类public class upLoadFile 生成上传凭证 然后准备上
  • maven打包生成source.jar

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 生成source jar mvn source jar 2 生成jar和souce jar mvn clean install source jar Dmaven test s
  • 传递世界坐标系和摄像机坐标系到shader

    11
  • 使用Python语言写一个推箱子游戏

    使用Python语言写一个推箱子游戏 本游戏旨在提供一个趣味性的益智游戏 玩家需要通过推动箱子到指定位置来过关 游戏规则 玩家需要推动一个或多个箱子到指定位置 才能过关 箱子只能向前推 不能拉回来 箱子不允许被推到障碍物 墙壁或其他箱子上
  • 如何高效学习 Python 的第三方库?

    你好 我是你们的老朋友 这篇文章来自同学的提问 问题就是如何高效学习 Python 的第三方库 我在此总结如下 通用思路 整体思路从以下几个角度入手 阅读文档 第三方库通常都会有相应的文档 文档会介绍这个库的功能 使用方法等内容 所以一定要
  • java 8安装教程

    1 下载JDK a 直接官网下载 不推荐 Java Downloads Oracle 注 现在官方下载需要登录账号 自行注册 登录Oracle账号 如果不想注册 登录账号 可选择百度网盘下载即可 b 或百度网盘 推荐 版本 jdk 8u29
  • fetchxml 汇总_Microsoft Dynamics CRM 4.0 更新汇总2

    946745 You cannot import the customization for an entity to a new system in Microsoft Dynamics CRM BUG 5824 CRM SE 94776
  • wechall writeup

    记录做wechall的题解 转载于 https www cnblogs com babers p 7226535 html
  • python 解决print数组/矩阵无法完整输出的问题

    问题描述 当数组 矩阵过大则只会显示其中一部分 中间则会自动用省略号代替 而我们想要去查看数组 矩阵的具体内容时 则需要将省略号代替的部分展示出来 解决方法 直接在import numpy 加上下面一句代码即可解决 import numpy
  • 几个巧妙的电流检测电路

    在电源等设备中通常需要做电流检测或反馈 电流检测通常用串联采样电阻在通过放大器放大电阻上的电压的方法 如果要提高检测精度 这地方往往要用到比较 昂贵的仪表放大器 以为普通运放失调电压比较大 下面介绍几种巧妙的廉价的电流检测电路 1 三极管电
  • Window XP驱动开发(十六) XP下新建驱动程序工程并编译的第二种方法

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 需要源码的可以与我联系 参考文章 http blog 163 com ljm1113 126 blog static 579
  • CButton & CMFCRibbonButton

    CButton public CWnd CMFCRibbonButton继承自CObject 不能添加消息映射
  • vmware虚拟机双网卡 实现本地内网和网络双连接

    一 vmware新建网卡 vmware中 编辑 gt 虚拟网络编辑器 gt 更改设置 网卡配置如下 桥接本地连接 NAT网卡连接网络 二 重启虚拟机 双网卡状态下 ifconfig可以看到有两个ip 可以同时ping通百度 远程公司内网 本
  • Windows系统安装Linux系统教程

    下载VMware workstation 安装地址如下 VMware下载地址 下载好了就是这个样子 我选择的是试用30天 大家也可以找破解版安装包 下载ubuntu ubuntu桌面版下载地址 下载桌面版就好 接下来是安装过程 每一步都有详
  • 如何使用apipost进行接口测试

    在之前的文档中对apipost导入api文档进行了介绍 本次将会给大家介绍一下如何使用apipost对之前导入的接口进行测试 接口测试的介绍 首先先对接口测试进行简单的介绍 接口测试是测试系统组件间接口的一种测试 主要用于测试系统与外部其他
  • Python计算机二级考试备考(重复元素判定)

    编写一个函数 输入参数为列表 如果一个元素在列表中出现了不止一次 这返回True 同时编写调用这个函数和输出测试结果的程序 def isRepeat x if type x type return print 输入错误 请输入列表类型 el
  • 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

    有趣的数据结构算法10 后缀表达式 PRN 介绍及利用栈计算后缀表达式的结果 解题思路 实现代码 GITHUB下载连接 在前一天已经利用栈完成2进制到8进制的转换 但是栈的应用方面还有很多 本次我将讲解如何计算后缀表达式的结果 解题思路 后