一、前言

  普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯。可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问。同时它也是一个很好锻炼栈这个数据结构的应用的问题。以下是用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语言实现逆波兰式)的更多相关文章

  1. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  2. Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算

    中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...

  3. hdu-1237 简单计算器---中缀表达式转后缀表达式

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...

  4. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  5. C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611

    09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...

  6. 栈的应用实例——中缀表达式转换为后缀表达式

    声明:本程序读入一个中缀表达式,将该中缀表达式转换为后缀表达式并输出后缀表达式. 注意:支持+.-.*./.(),并且输入时每输入完一个数字或符号都要加一个空格,特别注意的是在整个表达式输入完成时也要 ...

  7. RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript

    1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...

  8. .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)

    最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如: (1)将 ...

  9. ZH奶酪:Python 中缀表达式转换后缀表达式

    实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...

随机推荐

  1. 通过Performance Monitor观察程序内存使用情况

    在学习C# 数据类型和内存等知识点时,看到利用Windows系统下的Performance Monitor-性能监测工具查看程序内存的使用情况.使用过程中遇到个别小问题,现在把观察程序内存的操作步骤简 ...

  2. Nginx虚拟主机配置(20200202)

    一台机器上跑多个站点,即多个域名 curl -xIP:port 域名    用来指定访问的域名在哪个IP的哪个端口上 Nginx默认虚拟主机 不管什么域名解析到该服务器,都会访问到默认虚拟主机 ngi ...

  3. Android开发中按钮的语法

    按钮的主要作用就是触发一个动作,所以会用到监听器. 如何为按钮添加单机事件监听器: 1.匿名内部类作为单机事件监听器 案例: 首先在.xml文件中添加一个按钮一,然后设置其id属性,然后在main里获 ...

  4. matlab中的输出显示函数

    matlab中的输出显示函数 在matlab中使用的显示函数有disp.sprintf.fprintf比较常用.下面来介绍一下他们的用法. 1.disp()函数: disp(x)主要是用来输出变量x的 ...

  5. YARN安装和使用

    简介 Yet Another Resource Negotiator ,负责整个集群资源的调度,和管理,支持多框架资源统一调度(HIVE spark flink) 开启yarn 安装hadoop,可以 ...

  6. Java获取IP地址,IpUtils工具类,Java IP地址获取

    ================================ ©Copyright 蕃薯耀 2020-01-17 https://www.cnblogs.com/fanshuyao/ import ...

  7. Spring中@Value用法

    Spring中可以通过@Value注解,将properties配置文件中的属性值注入到java成员变量,配置和使用方法如下(大部分转自csdn,也有自己实验部分): 一.配置 首先,@value需要参 ...

  8. Uva12034 (组合数取模)

    题意:两匹马比赛有三种比赛结果,n匹马比赛的所有可能结果总数 解法: 设答案是f[n],则假设第一名有i个人,有C(n,i)种可能,接下来还有f(n-i)种可能性,因此答案为 ΣC(n,i)f(n-i ...

  9. JS格式时间

    Date.prototype.format = function(format) { var o = { "M+": this.getMonth() + 1, //month &q ...

  10. c++多线程编程互斥锁初步

    上一次讲述了多线程编程,但是由于线程是共享内存空间和资源的,这就导致:在使用多线程的时候,对于共享资源的控制要做的很好.先上程序: #include <iostream> #include ...