【C语言中缀转后缀】
中缀表达式
- 我们把平常所用的标准四则运算的表达式叫做中缀表达式,所有的运算符号都在俩数字中间
后缀表达式
- 后缀表达式是栈的运用,利用数组模拟栈的先进后出的特点,对后缀表达式进行计算
- 后缀表达式:后缀表达式是一种不需要括号的后缀表达法,我么也把他称为逆波兰表达式,为什么叫后缀表达式?原因就是所有的符号都是要在运算数字的后面出现
为什么要用后缀表达式
- 计算器读取更方便,计算起来更方便
- 举例:
9+(3-1)*3+10/2
进行后缀表达式的运算得出结果9 3 1 - 3 * + 10 2 / +
中缀转后缀
- 就以上述表达式为例子,将上述中缀表达式专为后缀
- 规则:从左到右遍历表达式的每个数字和符号,若是数字就输出(这里存放一个数组来将输出后的表达式放进去)成为后缀表达式的一员,若是符号,这里判断它与栈顶符号的优先级,是右括号或优先级不高于栈顶符号,则栈顶元素依次出栈并输出,并将当前的符号进栈,一直到输出完为止
- 上述的优先级是乘除大于加减,并且遇到右括号时候右括号是不进栈的
- 对于上述规则,我虚拟了一个存放操作符的栈
代码解析
- 定义运算优先级,对于计算机来说呀要让他准确的识别符号的优先级,我们设置一个Compare函数即可
- Compare
- 当遇到# 代表输入结束,返回0,遇到数字直接进入后缀表达式数组
/**中缀转后缀把输入的字符串分开来读取,根据优先级返回不同的数字,乘除最高,加减次之,括号最后,符号出栈的时候括号不进入后缀表达式的行列*/
int Compare(char str1) {if (str1 == '#') {return 0;} else if (str1 == '+' || str1 == '-') {return 1;} else if (str1 == '*' || str1 == '/') {return 2;} else if (str1 == '(' || str1 == ')') {return 0;}else {return -1; //数字}
}
- 后缀栈和操作符栈,虚拟栈模拟栈顶指针top = -1
char outPutStack[100] = {0};//结果栈int outPuttop = -1;//模拟栈顶指针char sympolStack[100] = {0};//中间栈(只存放字符)int sympolTop = -1;//模拟栈顶指针
- 输入字符串
char inputStr[100] = {0};//输入数组
scanf("%s", inputStr);int strLength = (int)strlen(inputStr);
- 主要算法代码的实现
/**循环读取输入的表达式,进行入栈或者出栈*/for (int i = 0; i < strLength;) {if (Compare(inputStr[i]) == -1) {outPutStack[++outPuttop] = inputStr[i++]; // 数字直接入后缀栈,i++表达先i后++} else if (inputStr[i] == '(') {sympolStack[++sympolTop] = inputStr[i++]; // 左括号先入表达式栈} else if (inputStr[i] == ')') {// 遇到右括号直接从符号栈里面开始找,Copmare函数,直接把括号的符号进入后缀栈,括号不进栈while (Compare(sympolStack[sympolTop]) != 0) {outPutStack[++outPuttop] = sympolStack[sympolTop--];}sympolTop--;//括号不入栈,直接把sympoltop--即可i++;} else { //遇到操作符// 根据规则。输入数组的操作符优先级大于等于操作栈顶元素的优先级的时候该运算符入栈if (sympolTop == -1 || Compare(sympolStack[sympolTop]) < Compare(inputStr[i])) {sympolStack[++sympolTop] = inputStr[i++];} else {// 若字符串中的操作符优先级小于或等于操作符栈顶操作符的优先级,就将操作符栈的栈顶元素弹出压入结果栈中,并且字符串中的位置不变,直到操作符栈为空或遇到高优先级的操作符outPutStack[++outPuttop] = sympolStack[sympolTop--];}if (inputStr[i] == '#') {while (sympolTop != -1) {outPutStack[++outPuttop] = sympolStack[sympolTop--];}break;}}}char endStack[outPuttop + 1];for (int i = 0; i < outPuttop +1; i++) {endStack[i] = outPutStack[i];printf("%c", outPutStack[i]);}return 0;
}
总结
- 中缀转后缀最主要的是强调算法过程,什么时候入栈什么时候出栈,记住符号的优先级,尤其注意top指针的位置,最后还需要查看符号栈是不是清空了,之前出现了少一个符号的问题
【C语言中缀转后缀】相关推荐
- C语言(中缀转后缀)
摘自<<数据结构与算法分析.第二版>>我目前看的就是这本书 a+b*c+(d*e+f)*g 转换成后缀表达式为:a b c * + d e * f + g * + 当读到一个操 ...
- c语言表达式的后缀,中缀表达式转换成后缀表达式C语言程序(一)
逆波兰表达式(Reverse Polish Notation)又叫后缀表达式.它是一种非常的表达式,可以将复杂的表达式转换成可以依靠简单的操作得到结果的表达.下面这段C语言即是用于实现将中缀表达式转换 ...
- C语言实现中缀转后缀表达式,并求值
C语言实现中缀转后缀表达式,并求值 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #inclu ...
- C语言实现中缀转后缀并计算表达式结果
文章目录 一.问题描述 二.AC代码 三.注意点 四.实现思路/代码解析 一.问题描述 [问题描述] 从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2 ...
- 【C语言】中缀转后缀(头歌数据结构)
一.问题解析:过程分为两步: 第一步,是将输入的字符串处理,运算符和数字分类储存. 第二部,将中缀转后缀. 二.实现思路 首先来看第一步是如何实现的: 当传入一个字符串,我们需要对字符串的每一个字符根 ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- 中缀表达式后缀表达式
什么是中缀表达式 中缀表达式就是 a+b 这样的,运算符在两个数的中间 什么事后缀表达式 后缀表达式就是 a b + 这样的,运算符在两个数后面 再细分一下 中缀表达式 后缀表达式 a+b-c a b ...
- 顺序栈计算器 中缀转后缀表达式
顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...
- 数据结构实验报告(二)简单计算器(中缀转后缀)
报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...
最新文章
- mysql二级制包安装 for RedHat Linux Enterprise6.4
- 利用蒙特卡算法仿真二进制双极性基带通信系统
- Pandas简明教程:六、Pandas条件查询
- Implementation of WC in JAVA
- oracle服务器找不到怎么解决,简析Oracle数据库常见问题及解决方案
- docker 安装mysql_安装docker并使用docker安装mysql
- 【Android Camera】之 Preview
- HDU1847 Good Luck in CET-4 Everybody!
- 【原创】VBA学习笔记(316)VBA编程基础知识扫盲,只适合纯自学新手看
- Java学习笔记:案例:标准体重计算器
- 2017年自动修复概述——Automatic Software Repair: A Survey [来自软件工程顶刊 TSE 2017]
- 宏正自动科技发表新款8/16端口双滑轨LCD KVM多电脑切换器
- ZIP压缩包下载总结
- 2021青岛十九中高考成绩查询,@青岛高考生 2020新高考模拟考可以查成绩了
- 知识管理:如何让“隐形的翅膀”飞起来?
- pycharm创建.ini文件
- C语言网:神奇的fans
- 确定性网络(DetNet、D-IP)技术
- 服务器返回的信息无效或不可识别
- 信息系统工程监理服务标准贯标证书