有趣的数据结构算法11——实现中缀表达式到后缀表达式的转换

2023-11-03

有趣的数据结构算法11——实现中缀表达式到后缀表达式的转换

这是学习栈的最后一篇blog了,在上一篇博客里,讲述了如何利用栈计算后缀表达式的结果,但是谁会无缘无故用后缀表达式写一个式子在那里计算呢?这么仔细一想,岂不是……
在这里插入图片描述
其实也不是完蛋,只要在写个程序完成中缀表达式到后缀表达式的转换即可。

解题思路

在上一篇博客里我已经简要介绍了什么是后缀表达式。还不了解的朋友可以看看我的上一篇博客。
https://blog.csdn.net/weixin_44791964/article/details/97143790
中缀表达式向后缀表达式的转换公式如下:

中缀表达式转换到后缀表达式公式
转换规则是这样的,转换时也需要利用到栈。
1、如果遇到的是数字,直接将其输出。
2、如果遇到操作符’(’、’*’、’/’,由于其优先级较高,直接进行入栈。
3、如果遇到操作符’)’,则取出其与’(‘之间的所有操作符,同时取出’(’。
4、如果遇到操作符’+’、’-’,如果之前曾经将’(‘压入栈,则取出其与’(‘之间的所有操作符,不取出’(’;如果之前未将’(‘压入栈,则取出所有操作符,因为在栈中的所有操作符的优先级都比最后一个’+’、’-'高。
5、如果输入到达末尾,弹出所有操作符。

假定待求后缀表达式的中缀表达式为:1+2+5*(3+6)-7。其转换结果为1 2 + 5 3 6 + * + 7 - ,其转换过程如下:
1、遍历表达式,遇到1,直接输出,此时输出为:1
2、接着读到‘+’号,压入栈。

示例1
3、接着读到2,直接输出,此时输出为:1 2
4、接着读到‘+’号,由于栈中的操作符优先级较高,所以首先元素出栈并输出,此时输出为1 2 +,再将新的‘+’号入栈。

示例2
5、接着读到5,直接输出,此时输出为:1 2 + 5
6、接着读到‘*’号和‘(’左括号,以此入栈。

示例3
7、接着读到3,直接输出,此时输出为:1 2 + 5 3
8、接着读到‘+’号,由于栈顶元素为’(’,无需读出任何元素,直接入栈。

示例4
9、接着读到6,直接输出,此时输出为:1 2 + 5 3 6
10、接着读到‘)’右括号,取出其与’(‘之间的所有操作符,同时取出’(’,此时输出为1 2 + 5 3 6 +

示例5
11、接着读到‘-’号,由于栈内已经没有’(’,读出所有栈内元素,此时输出为1 2 + 5 3 6 + * +,再将’-'号压入栈。

示例6
12、接着读到7,直接输出,此时输出为:1 2 + 5 3 6 + * + 7
13、由于输入完成,所有元素出栈,得到输出:1 2 + 5 3 6 + * + 7 -

实现代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Initsize 30
#define Newsize 30

typedef char Ele;

struct Stack{
	Ele* Top;
	Ele* Base;
	int Stacksize;
};
typedef struct Stack* stk;


void init(stk);				//函数声明
void push(stk p, Ele e);	
Ele pop(stk p);

void init(stk p){			//初始化函数
	p->Base = (Ele*)malloc(Initsize*sizeof(Ele));
	if (p->Base == NULL){
		printf("内存分配失败。");
		exit(1);
	}
	p->Top = p->Base;
	p->Stacksize = Initsize;
}

void push(stk p, Ele e){	//入栈
	int len;
	len	= p->Top - p->Base;
	if ( len >= p->Stacksize)
	{	//动态分配空间
		p->Base = (Ele*)realloc(p->Base, (p->Stacksize + Newsize)*sizeof(Ele));
		if (p->Base == NULL){
			printf("内存分配失败。");
			exit(1);
		}
		p->Stacksize = p->Stacksize + Newsize;
		p->Top = p->Base + len;
	}
	*(p->Top) = e;
	p->Top++;
}

Ele pop(stk p){		//出栈
	Ele e;
	if (p->Top == p->Base){
		printf("已经到达底端");
		exit(0);
	}
	(p->Top)--;
	e = *(p->Top);
	return e;
}

int main(){
	struct Stack p;		//定义栈
	Ele c,e[3]="0 ";		//c用于接收键盘字符
	//定义e[]是因为使用strcat函数要求两个输入量都是字符串,需要以\0结尾,不可以直接加入一个字符
	Ele str[10],all[200]="";	//str用于保存输入小鼠,all用于存储得到的输出后缀表达式。
	int i = 0;					//temp量

	init(&p);					//初始化

	printf("请输入一个算式:");
	scanf("%c", &c);
	while (c != '#')
	{
		while ((c <= '9' && c >= '0') || c == '.'){		//输入一个小数
			str[i++] = c;
			if (i >= 10){
				printf("输入数据过大");
				exit(1);
			}
			scanf("%c", &c);
			if (!(c <= '9' && c >= '0') && c != '.'){
				str[i++] = ' ';
				str[i] = '\0';
				strcat(all, str);
				i = 0;
				break;
			}
		}
		if (c == '#')
			break;
		switch (c)								//操作符判断
		{
		case '(':
		case '*':
		case '/':
			//如果遇到操作符'('、'*'、'/',由于其优先级较高,直接进行入栈。
			push(&p, c);
			break;
		case '+':
		case '-':
			//如果是+号或者-号,如果之前曾经将'('压入栈,则取出其与'('之间的所有操作符,不取出'(';
			//如果之前未将'('压入栈,则取出所有操作符,因为在栈中的所有操作符的优先级都比最后一个'+'、'-'高。
			while (p.Base != p.Top){		
				e[0] = pop(&p);
				if (e[0] == '*' || e[0] == '/' || e[0] == '+' || e[0] == '-'){
					strcat(all, e);
				}
				else{
					push(&p, e[0]);
					break;
				}
			}
			push(&p, c);
			break;
		case')':
			//如果遇到操作符')',则取出其与'('之间的所有操作符,同时取出'('。
			while ((e[0] = pop(&p)) != '('){
				strcat(all, e);
			}
		default:
			break;
		}
		scanf("%c", &c);
	}
	//如果输入到达末尾,弹出所有操作符。
	while (p.Base != p.Top){
		e[0] = pop(&p);
		strcat(all, e);
	}
	printf("%s", all);
	return 0;
}

GITHUB下载连接

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

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

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

有趣的数据结构算法11——实现中缀表达式到后缀表达式的转换 的相关文章

  • 标准时间格式转unix时间戳格式,误差8小时问题常见原因剖析

    标准时间格式即人一眼就能看懂的时间格式 比如 2017 11 28 15 00 00 unix时间戳格式 就是从1970年1月1日0点0分0秒 UTC GMT的午夜 开始计时 所经过的秒数 前端工作中有一次遇到需要从数据库中取出标准格式时间
  • postgres的时间转换

    天下苦postgres时间转换久已 最近在操作数据库时 遇到频繁的时间操作 每次弄完了就忘了 今天痛定思痛 下定决心 终于自己也受不了自己的lazy了 对postgres的时间操作进行一下总结 本文竟可能详尽的记录postgres中涉及到d
  • 有趣的数据结构算法17——哈夫曼编码及其c语言实现

    有趣的数据结构算法17 哈夫曼编码及其c语言实现 什么是哈夫曼编码 哈夫曼编码过程举例 利用c语言实现哈夫曼编码 生成哈夫曼树 生成哈夫曼编码 解码与编码 全部实现代码 GITHUB下载连接 哈夫曼编码真的好复杂噢 什么是哈夫曼编码 哈夫曼
  • 有趣的数据结构算法2——快速排序

    有趣的数据结构算法2 快速排序 题目复述 题目分析 具体实现代码 GITHUB下载连接 题目复述 数据排序算法是一类常见算法 其适用范围深入编程的方方面面 常见的数据排序算法有冒泡排序 堆排序 简单选择排序等等 各个适用范围不同 快速排序由
  • C# JSON 常用方法 - Json字符串转对象

    创建项目 ConsoleApplication Json 选择项目右键管理NuGet程序包 搜索Newtonsoft Json 并下载安装 选择项目添加 JsonHelper cs 添加引用 using Newtonsoft Json 编写
  • kettle 教程(一):简介及入门

    介绍 kettle 是纯 java 开发 开源的 ETL工具 用于数据库间的数据迁移 可以在 Linux windows unix 中运行 有图形界面 也有命令脚本还可以二次开发 kettle 的官网是 https community hi
  • 有趣的数据结构算法14——二叉树的构建

    有趣的数据结构算法14 二叉树的构建 什么是树 什么是二叉树 二叉树特点 二叉树内的常用概念 二叉树的实现 整体实现代码 GITHUB下载连接 每天学习一点点 我就能变成马云哥哥的打工仔 什么是树 树状图是一种数据结构 它是由n n gt
  • 如何快速将WPS表格或者excel数据将表格转化为json

    目录 简介 一 在表格数据的前后插入列 加上双引号 分号 逗号 二 利用表格的公式合并内容 1 在表格合并的项行后面选择或插入新的一列或一行 然后在第一个空格输入 号 2 然后用鼠标点击要合并的第一行的第一个内容格 即相对应等号的那一列 在
  • 有趣的数据结构算法11——实现中缀表达式到后缀表达式的转换

    有趣的数据结构算法11 实现中缀表达式到后缀表达式的转换 解题思路 实现代码 GITHUB下载连接 这是学习栈的最后一篇blog了 在上一篇博客里 讲述了如何利用栈计算后缀表达式的结果 但是谁会无缘无故用后缀表达式写一个式子在那里计算呢 这
  • 如何在线免费将MP4转换成MP3格式音乐

    MP4已经成为互联网上最流行的视频格式 我们从各种视频资源网站上下载到的视频文件大部分都是以MP4格式存储的 尤其是一些高品质的歌曲MV 为了达到在高压缩的前提下得到最好的质量 几乎都是mp4文件 但是如果你想直接在手机或者车上听这些歌曲
  • 有趣的数据结构算法5——利用循环链表解决Josephus问题

    有趣的数据结构算法5 利用循环链表解决Josephus问题 题目复述 解题思路 实现代码 GITHUB下载连接 本次教程主要讲述如何利用循环链表解决Josephus问题 题目复述 据说著名犹太历史学家 Josephus有过以下的故事 在罗马
  • 有趣的数据结构算法7——双向循环链表的实例应用

    有趣的数据结构算法7 双向循环链表的实例应用 问题复述 解题思路 实现代码 GITHUB下载连接 问题复述 要求实现用户输入一个数字改变26个字母的排列顺序 正常情况下26个字母的排列顺序是A B C D E F G H I J K L M
  • windows如何让电脑朗读你的文字

    在使用电脑的过程中 常常需要文字能够自动朗读 那么你是如何解决的呢 其实可以不借助任何外部软件 而使用windows记事本就能简单将任意文字转化成语音朗读 步骤1 新建一个记事本 注意记事本的默认后缀名为 txt 步骤2 打开记事本 在记事
  • Spark中json字符串和DataFrame相互转换

    本文介绍基于Spark 2 0 的Json字符串和DataFrame相互转换 json字符串转DataFrame spark提供了将json字符串解析为DF的接口 如果不指定生成的DF的schema 默认spark会先扫码一遍给的json字
  • 计算机操作系统之期末考试复习——进程的基本状态及转换

    进程的基本状态 就绪状态 Ready 进程已处于准备好运行的状态 即进程已分配到除CPU以外的所有必要资源后 只要获得CPU 便可立即执行 执行状态 Running 进程以获得CPU 其程序正在执行的状态 阻塞状态 Block 正在执行的进
  • 有趣的数据结构算法4——单链表插入元素、删除元素

    有趣的数据结构算法4 单链表插入元素 删除元素 单链表插入元素 单链表删除元素 实现代码 GITHUB下载连接 关于什么是单链表以及如何进行单链表的生成 遍历等操作大家可以关注我的另一篇博文 有趣的数据结构算法3 单链表尾插法和头插法的实现
  • 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

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

    有趣的数据结构算法16 线索二叉树的构建 什么是线索二叉树 线索二叉树的实现形式 线索二叉树的代码实现 线索二叉树的初始化 线索的串联 全部实现代码 GITHUB下载连接 深度遍历不仅仅有递归的方法噢 还有通过建立线索二叉树进行遍历的方法
  • Map遍历取值的五种方式

    方法1 Set set map keySet for Object o set System out println o map get o 方法2 Set set map keySet Iterator iterator set iter
  • 逆波兰表达式求值(C语言实现)

    实验项目 从文本文件输入任意一个语法正确的 中缀 表达式 显示并保存该表达式 利用栈结构 把上述 中缀 表达式转换成后缀表达式 并显示栈的状态变化过程和所得到的后缀表达式 利用栈结构 对上述后缀表达式进行求值 并显示栈的状态变化过程和最终结

随机推荐

  • ImportError: cannot import name ‘XXXA‘ from ‘XXXB‘

    ImportError cannot import name XXXA from XXXB 废话不多说直接看问题 废话不多说直接看问题 ImportError cannot import name XXXa from XXXB 当你排除拼写
  • 四阶行列式直接展开_01行列式的定义上海交大

    本文文字和图片非原创 来源如下 强烈推荐原视频 作者 上海交通大学 知名教授 蒋启芬 高云 崔振等 平台 网易公开课 内容 线性代数 第一讲 行列式的定义 序言 对二元一次方程组 几何意义 平面上的两条动直线 通过加减消元可以变形到下边这种
  • 如何将本地项目上传至Gitee仓库(详细教程)

    码云 Gitee 简单介绍 Git 是一个开源的分布式版本控制系统 用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 Git 与常用的版本控
  • C++-函数模板特化如何避免重复定义

    我正在用一个基于模板的库源代码 该库包含一些针对特定类型的模板函数特化 类模板 函数模板和模板函数特化都在头文件中 我在我的 cpp文件中 include 头文件并编译链接工程 但是为了在整个工程中使用该库 我将头文件包含在 stdafx
  • Linux——线程安全

    概念 线程安全就是在多线程运行的时候 不论线程的调度顺序怎样 最终的结果都是一样的 正确的 那么就说这些线程是安全的 要保证线程安全需要做到 对线程同步 保证同一时刻只有一个线程访问临界资源 在多线程中使用线程安全的函数 可重入函数 所谓线
  • sql语句多表查询

    问题及描述 1 学生表 Student S Sname Sage Ssex S 学生编号 Sname 学生姓名 Sage 出生年月 Ssex 学生性别 2 课程表 Course C Cname T C 课程编号 Cname 课程名称 T 教
  • 微信小程序客服功能接入指南

    一 功能介绍 1 客服消息会话入口有两个 1 小程序内 开发者在小程序内添加客服消息按钮组件 用户可在小程序内唤起客服会话页面 给小程序发消息 2 已使用过的小程序客服消息会聚合显示在微信会话 小程序客服消息 内 用户可以在小程序外查看历史
  • Windows 10 安装wsl(linux子系统)

    目录 1 简介 2 检查windows 系统版本 是否符合要求 3 安装wsl2 2中方式 3 1手动安装 3 2 应用商店安装 4 资料参考 1 简介 wsl是适用于windows环境linux子系统 支持windows 10 11和wi
  • 软件测试基础理论详解

    1 软件测试定义 软件测试 Software Testing 在规定的条件下对程序进行操作 以发现程序错误 衡量软件质量 并对其是否能满足设计要求进行评估的过程 2 软件测试工程师的素质 良好的沟通和表达能力 具有怀疑与破坏的精神 扎实的软
  • Unity实现异步加载场景

    一 创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel 取名为LoadScreen 再在loadScreen下面创建一个Image组件 放置背景图片 然后我们再在lpadScreen下面继续创建一个Slider 这
  • jdbc C3P0容错和自动重连

    1 C3P0容错和自动重连与以下配置参数有关 breakAfterAcquireFailure true表示pool向数据库请求连接失败后标记整个pool为block并close 就算后端数据库恢复正常也不进行重连 客户端对pool的请求都
  • CentOS8基础篇14:使用源代码安装FTP软件

    一 TAR包管理工具简介 TAR Tape Archive TAR 是Linux下的包管理工具 利用tar命令可以将要备份保存的数据打包成一个扩展名为 tar的文件 以便文件的保存 需要使用时再利用tar命名进行释放即可 使用tar命令对文
  • Java面向对象编程

    下面有关JVM内存 说法错误的是 A 程序计数器是一个比较小的内存区域 用于指示当前线程所执行的字节码执行到了第几行 是线程隔离的 B Java方法执行内存模型 用于存储局部变量 操作数栈 动态链接 方法出口等信息 是线程隔离的 C 方法区
  • 自己组装电脑配置清单2022 自己组装电脑需要哪些配件

    自己组装电脑需要主板 CPU处理器 CPU散热器 内存条 显卡 硬盘 鼠标 键盘 声卡 耳机 音箱 机箱 显示器 电源等等 组装电脑怎么搭配更合适这些点很重要 http www adiannao cn du 3500左右性价比游戏型组装电脑
  • 【RPA】机器人流程自动化(RPA)概念、原理与实践

    多数人每天都会使用到一些机器人流程自动化工具 例如读取邮件和系统 计算 生成文件和报告 而在未来 那些你不想做的枯燥的工作 也许真的可以不做了 重复化 标准化的工作都可以让机器人帮你完成 本期推文特邀陈剑独家原创阐述RPA的概念 原理与实践
  • Kubernetes 的控制器模型

    文章目录 控制器模式 控制循环 控制器的配置和定义 Deployment 控制器详解 水平扩展 收缩 滚动更新 版本控制 控制器模式 本篇文章我们来看看 编排 这个 Kubernetes 项目最核心的功能吧 经过上篇文章的介绍后 你可能已经
  • redis主从-哨兵模式(windows下搭建)

    一 下载 由于redis官方并不支持windows操作系统 所以官网上是下不到的 需要到gitlab上下载 下载地址如下 https github com MicrosoftArchive redis releases 二 解压安装 将下载
  • webpack4---模块化打包工具(一)

    一 webpack4初识 1 首先先了解几个规范 ES规范 导出 export default Header 导入 import Header from header js CommonJS规范 导出 module exports Head
  • 如何快速安装和配置Node.js环境

    Node js是一种可以简化Web应用程序开发的平台 它使用JavaScript编写 并使用Chrome V8 JavaScript引擎 本文将介绍如何快速安装和配置Node js环境 为读者打开了Node js的大门 并提供了背景信息 一
  • 有趣的数据结构算法11——实现中缀表达式到后缀表达式的转换

    有趣的数据结构算法11 实现中缀表达式到后缀表达式的转换 解题思路 实现代码 GITHUB下载连接 这是学习栈的最后一篇blog了 在上一篇博客里 讲述了如何利用栈计算后缀表达式的结果 但是谁会无缘无故用后缀表达式写一个式子在那里计算呢 这