后缀表达式的计算【C语言】【数据结构】

2023-11-12

什么是后缀表达式?

逆波兰表达式_百度百科

后缀表达式又称(逆波兰表达式)先看一下我们常见的:2 * 5 - ( 3  + 9 ) / 6,这其实就是中缀表达式;将其写成后缀表达式就是:

2   5  *  3   9  +  6  /  -  (每个字符用空格隔开)。

中缀表达式到后缀表达式怎么变的??为什么要这么写??

中缀表达式到后缀表达式其实很简单:

1.首先为每一个运算符的一对操作数加上括号。(+、-、*、/  都属于二目运算符)

2.将每个括号中的运算符提到括号的做右边(这就是为啥叫后缀表达式的原因,你提到括号前面它就是前缀表达式了)。

3.去掉所有括号。为了方便观察,每一个数字/运算符 都用空格间隔开

首先回答一下为什么要这么写。这其实是为了方便计算机来计算,就先刚才上面的式子,如果是人来算,你很清楚的直到要先计算括号里的,然后计算乘除再计算加减。但计算机就没这么“聪明”了。如果交给计算机来算,你得把他写成后缀表达式的形式。

这懂了,那么如何计算呢?

后缀表达式就是为了方便“无脑计算”。中缀表达式计算需要分优先级,在后缀表达式的计算过程中就不用管这么多,遇到运算符直接计算即可(需要注意的是,如果是减‘-’或者除‘/’,需要将先出栈的结果作为除数,后出栈的作为被除数,这一点在后面代码部分体现),总之就一条规则===》》“后出栈元素 (+、-、*、/)先出栈元素”。(这里仍然考虑的比较简单,忽略了除数可能为0 的情况)。

具体看下图

 程序源码:

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

#define Size 100
//堆栈结构体类型
typedef struct stack {
    int top;
    int nums[Size];
} St;

//函数声明
void ruzhan(St *S, int x);

int chuzhan(St *S);

int main() {
    St S;S.top = -1;
    int sign = 0, x, x1, x2;
    char c;
    scanf("%c", &c);   //接收一个字符
    while (c != '@') { //接收字符直到遇到终止符号
        if (c == ' ' && sign == 1) {
            sign = 0;
            ruzhan(&S, x);
        }
        if (c >= '0' && c <= '9') {
            if (sign != 1) {
                x = (int) (c - '0');
                sign = 1;
            } else {
                x = x * 10 + (int) (c - '0');
            }
            //-----------------------------------
        } else {
            switch (c) {   //判断是否为运算符
                case '+':
                    ruzhan(&S, chuzhan(&S) + chuzhan(&S)); //出栈两次计算其相加结果并入栈
                    break;
                case '-':
                    x1 = chuzhan(&S);    //减数
                    x2 = chuzhan(&S);    //被减数
                    ruzhan(&S, x2 - x1); //计算差
                    break;
                case '*':
                    ruzhan(&S, chuzhan(&S) * chuzhan(&S)); //计算乘法
                    break;
                case '/':
                    x1 = chuzhan(&S);    //除数
                    x2 = chuzhan(&S);    //除数
                    if (x1 == 0) {       //除数为0退出
                        exit(0);
                    }   //合法则将其商入栈
                    ruzhan(&S, x2 / x1); //计算商
                    break;
            }
        }
        scanf("%c", &c);   //继续接收字符
    }
    printf("后缀表达式计算结果:%d", chuzhan(&S));   //输出结算结果
}

int chuzhan(St *S) {
    St *p = S;
    if (p->top < 0) {
        exit(0);
    } else {
        return p->nums[(p->top)--];
    }
}

void ruzhan(St *S, int n) {
    St *p = S;
    if (p->top >= Size - 1) {
        return;
    } else {
        (p->top)++;
        p->nums[p->top] = n;
    }
}

忘了说,2 * 5 - ( 3  + 9 ) / 6的计算结果为8;

使用刚写的程序计算其后缀表达式:2   5  *  3   9  +  6  /  - 。结果必须得一致;运行结果见下图:

 

关于其中如下的一段代码,其作用是将输入的连续数字字符转换为对应位数的数,例如字符串“123”,将其转化为数字一百二十三。如果没有一下算法支持,该程序只能计算运算数为-9到+9的范围。

 

if (c == ' ' && sign == 1) {
   sign = 0;
   ruzhan(&S, x);
}
if ( c <= '9'&&c >= '0' ) {
    if (sign != 1) {
        x = (int) (c - '0');
        sign = 1;
    } else {
        x = x * 10 + (int) (c - '0');   //累加和
    }
} 

其实和单词判断思路大差不差:【C语言】输入一行字符串,统计其中的单词数_.魚肉的博客-CSDN博客

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

后缀表达式的计算【C语言】【数据结构】 的相关文章

随机推荐

  • 目标识别、目标跟踪算法总结

    想自学图像处理的相关知识 正好实验室师兄做过两个关于红外目标跟踪的项目 因此从mean shift SR RP PF开始学习 但是查阅资料的时候 发现对各种算法理解非常 利用图像处理算法 实现的功能一般包括 目标的检测 识别 跟踪 常见的问
  • 机器学习顶刊文献_哪些成为了经典-引用次数最多的10篇机器学习文献

    近40年来机器学习领域产生了数以万计的论文 并以每年上万篇的速度增长 但真正能够称为经典 经受住历史检验 能投入实际应用的并不多 本文整理了机器学习历史上出现的经典论文 按照被引用次数对它们进行了排序 分为top10 被引用次数超过2万 被
  • FreeModbus的移植

    FreeModbus V1 6 主机使用说明 一 简述 FreeModbus是一款开源的Modbus协议栈 但是只有从机开源 主机源码是需要收费的 同时网上也没有发现比较好的开源的Modbus主机协议栈 所以才开发这款支持主机模式的Free
  • 【Docker】使用Docker在远程服务器上安装MySQL8并使用本地navicat连接

    使用Docker在远程服务器上安装MySQL8并使用本地navicat连接 一 下载MySQL8镜像 二 启动MySQL容器 三 配置MySQL数据库的远程访问 使用本地navicat连接服务器MySQL 四 docker中删除已创建的容器
  • 虚拟机使用情况(持续更新)

    装了虚拟机后今天打开发现文字变成了英文的 并且装好的系统打不开机 出现提示 本来用的好好的 怎么就出问题了呢 回忆起来最后使用时为了方便整理磁盘 把安装在E盘的所有虚拟机文件都放在一个命名文件里 我恢复原样后就正常使用了 可能是之前下载的时
  • 操作系统之PV操作

    基本概念 进程状态 进程通常分为就绪 运行和阻塞三个工作状态 三种状态在某些条件下可以转换 三者之间的转换关系如下 进程三个状态之间的转换就是靠PV操作来控制的 PV操作主要就是P操作 V操作和信号量 其中信号量起到了至关重要的作用 信号量
  • 微信小程序分享页面代码

    在微信小程序中实现分享功能需要以下几个步骤 1 在 app json 文件中配置分享参数 例如标题 路径等 示例如下 json pages pages index index window navigationBarTitleText 小程
  • java print\println\printf的区别

    printf主要是继承了C语言的printf的一些特性 可以进行格式化输出 print就是一般的标准输出 但是不换行 print将它的参数显示在命令窗口 并将输出光标定位在所显示的最后一个字符之后 println www infocool
  • 源NAT,目的NAT和PAT以及端口映射的区别?

    一 NAT 1 动态NAT 地址复用 指将内部私有IP转换为公网IP地址时 IP的对应关系是不确定的 也就是说只要指定哪些内部地址可以进行NAT转换 以及哪些可以的合法的IP地址可以作为外部地址 就可以进行动态转换了 也可以使用多个合法地址
  • unity3d运行后自动暂停_Unity3D 关于延迟、暂停执行脚本的几个方法总结

    1 InvokeRepeating函数 和 Invoke函数 个人认为最为有效方法 用法 InvokeRepeating delayOpen 1 5 1秒后调用 delayOpen 函数 之后每5秒调用一次 写在Start函数内 Invok
  • python实现时间序列信号的频谱、倒频谱以及功率谱

    python实现时间序列信号的频谱 倒频谱以及功率谱 认识傅里叶变换 一 频谱 1 引入库 2 频谱函数封装 二 功率谱 功率谱谱函数封装 三 倒频谱 倒频谱谱函数封装 以振动信号为例 认识傅里叶变换 这里我就不多说了 百度谷歌一大堆说的明
  • /sys/module/ 模块信息 目录与/proc/modules文件

    在内核模块编译中 会选择编译成模块 或者build in 内核镜像中 其中对内核模块有很好的的说明 这也是linux在嵌入式当中得到广泛应用的充分体现 内核中有很多功能选项 其中有许多使我们不需要的 内核设计成模块的优势所在就在这里 不需要
  • Android java.lang.UnsatisfiedLinkError: No implementation found

    例如 该项目的如下报错 java lang UnsatisfiedLinkError No implementation found for void org webrtc PeerConnectionFactory nativeIniti
  • Python 环境变量配置详解

    文章目录 1 配置前准备 1 1 检查环境变量是否配置成功 1 2 查询 python exe 的安装路径 2 配置步骤 2 1 进入高级系统设置 2 2 设置环境变量 2 1 1 配置 Python exe 所在路径 2 2 1 配置 p
  • GIT 仓库 子模块 SUBMODULE 拉取子仓库代码

    找到 gitmodules 文件所在的目录 在该目录下运行命令 git submodule init git submodule update
  • DNS请求响应

    问题背景 在无线网络可用 而有线网络不可用的场景下 依靠第三方接口解析域名 或者udp tcp接口内部解析域名 会默认阻塞10秒钟 办法 自行定制dns请求及响应 BOOL SendDNSRequest sockaddr in sockAd
  • Low Memory Killer

    oom score adj 计算方法 oom score adj oom adj OOM SCORE ADJ MAX OOM DISABLE OOM SCORE ADJ MAX 1000 OOM DISABLE 17 其中 oom adj
  • c# mysql 二进制图片_C#将image中的显示的图片转换成二进制

    1 将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是 二进制数据 因此必须将图像文件转换成字节数组才能存入数据库中 View Code 将本地图片转换成二进制保存起来 private byte SetImageT
  • MATLAB元胞数组

    MATLAB元胞数组 元胞数组 元胞数组是MATLAB的一种特殊数据类型 可以将元胞数组看做一种无所不包的通用矩阵 或者叫做广义矩阵 组成元胞数组的元素可以是任何一种数据类型的常数或者常量 每一个元素也可以具有不同的尺寸和内存占用空间 每一
  • 后缀表达式的计算【C语言】【数据结构】

    什么是后缀表达式 逆波兰表达式 百度百科 后缀表达式又称 逆波兰表达式 先看一下我们常见的 2 5 3 9 6 这其实就是中缀表达式 将其写成后缀表达式就是 2 5 3 9 6 每个字符用空格隔开 中缀表达式到后缀表达式怎么变的 为什么要这