栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)
一、前言
普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯。可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问。同时它也是一个很好锻炼栈这个数据结构的应用的问题。以下是用c语言实现中缀表达式到后缀表达式的转换的代码。本文仅讨论转换,不涉及计算。实际上如果了解了栈是如何在这上面应用,计算和前缀、中缀、后缀的相互计算和转换便简单了许多。对于三只种表达方式的转换,还有的做法是建立二叉树,录入数据,三种不同的遍历方式就是三种表达方式。本文若有错误欢迎指出。
二、代码
#include <stdio.h>
int main(void)
{
int top=-1;
char s[25],temp; //栈的大小根据需要更改,或者可以用内存分配来解决
while((temp=getchar())!='\n')
{
if(temp>='A'&&temp<='Z'||temp>='a'&&temp<='z'||temp>='0'&&temp<='9'||temp=='.') //包含数字表达式和字母表达式,支持小数
printf("%c",temp);
else
{
if(temp=='*'||temp=='/')
{
while(top>=0&&(s[top]=='*'||s[top]=='/')) //保证栈不会越界
printf("%c",s[top--]);
s[++top]=temp;
}
else if(temp=='+'||temp=='-')
{
while(s[top]!='('&&top>=0)
printf("%c",s[top--]);
s[++top]=temp;
}
else if(temp=='(')
s[++top]=temp;
else if(temp==')')
{
while(s[top]!='(')
printf("%c",s[top--]);
top--;
}
}
}
while(top>=0)
printf("%c",s[top--]); //余下运算符出栈
return 0;
}
三、分析
1.转换规则
- 遇到数字字符直接输出或经过转换成数字后输出
- 遇到‘(’字符直接进栈
- 遇到‘)’字符,将‘(’字符前的运算符依次出栈并输出,‘(’字符只出栈,不输出
- 遇到运算符时,将优先级比此运算符小或等于的运算符依次出栈,再将其入栈
- 读取完整个串后,将栈中所有运算符出栈
2.注意事项
在写判断条件时注意逻辑要清晰,确定出入栈不会越界,而且所有元素都正确的出入栈,不要有出栈遗漏或者入栈重叠的情况,确定所有转换条件都完整的进行了表达,注意某些特殊情况,尽量做到全面。
栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)的更多相关文章
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算
中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...
- hdu-1237 简单计算器---中缀表达式转后缀表达式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放
01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...
- C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611
09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...
- 栈的应用实例——中缀表达式转换为后缀表达式
声明:本程序读入一个中缀表达式,将该中缀表达式转换为后缀表达式并输出后缀表达式. 注意:支持+.-.*./.(),并且输入时每输入完一个数字或符号都要加一个空格,特别注意的是在整个表达式输入完成时也要 ...
- RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript
1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...
- .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)
最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如: (1)将 ...
- ZH奶酪:Python 中缀表达式转换后缀表达式
实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...
随机推荐
- U盘装系统/win to go制作笔记
//添加图片太麻烦了吧,我扔相册里了,需要自取吧. //U盘装系统 环境:win10戴尔灵越台式机 硬件:16G U盘,Windows电脑 软件:老毛桃启动装机工具,win10镜像1803版本 进入网 ...
- opencv —— Sobel 一阶导数算子、Scharr 滤波器 一阶导数用于边缘检测
sobel 算子的基本概念 sobel 算子是一个主要用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用于计算图像灰度函数的近似梯度. 其基础来自于一个事实,即在边缘部分,像素值出现“跳跃”或 ...
- Excel开启宏以后保存是会提示安全警告,怎么取消
如果你用的(应该)是2007以上版本的话 请点左上角的EXCEL图标,EXCEL选项,信任中心,信任中心设置,个人信息选项,保存时从文件属性中删除个人信息前面的对号取消.确定就可以了. (补充:如果你 ...
- jQuery---jquery.color.js和jquery.lazyload.js的使用
jquery.color.js的使用 了解即可 <!--1. 引入jquery的js文件--> <script src="jquery-1.12.4.js"> ...
- Windos framework .net 3.5规则失败
1. 安装的时候有一个.net警告,这里给后边造成了一个隐患,实际上是wondows少了一个framework .net的插件,跟SQLserver安装本身没关系,一开始忽略了,后边就报错了. 2.点 ...
- C语言二级选择题考点汇总-数据结构与算法-【考点一】 什么是算法
1.算法及其基本特征 算法是指对方案的准确描述,是解决问题的执行步骤. 算法不等于数学上的计算方法,也不等于程序.程序是算法的载体. 算法的基本特征如下: (1)可行性:步骤可实现,执行结果可达到 ...
- github访问过慢
转:https://baijiahao.baidu.com/s?id=1608100091125662190&wfr=spider&for=pc https://www.cnblogs ...
- Tutorial: Publishing additional services for printing
Complexity:IntermediateData Requirement:Use your own data There may be occasions when you need to pu ...
- laravel手动数组分页
laravel文档中已经有写如何自己使用分页类去分页了,但没有详细说明. 如果你想手动创建分页实例并且最终得到一个数组类型的结果,可以根据需求来创建 IlluminatePaginationPagin ...
- 【database】oracle集合 - Associative Arrays、Varrays、Nested Tables
前言 参考oracle官方文档:PL/SQL Language Reference 11g Release 2 - 5 PL/SQL Collections and Records 可以去看下文档 ...