【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想:

从头到尾依次读取中缀表达式里的每个对象,对不同对象按照不同的情况处理。

  1. 如果遇到空格,跳过
  2. 如果遇到运算数字,直接输出
  3. 如果遇到左括号,压栈
  4. 如果遇到右括号,表示括号里的中缀表达式已经扫描完毕,将栈顶的运算符弹出并输出, 直至遇到左括号(左括号出栈但是不输出)
  5. 若遇到运算符,若当前运算符优先级高于栈顶运算符,将其压栈; 若小于等于栈顶元素的优先级,将栈顶运算符弹出并输出,再比较新的栈顶运算符,直到该运算符优先级高于栈顶运算符优先级为止,然后将其压栈。
  6. 若中缀表达式各个对象处理完毕,则把堆栈里的运算符一并输出。

示例

在这里插入图片描述

代码


int precedence(char op) {if (op == '+' || op == '-') return 1;else if (op == '*' || op == '/') return 2;else return 0; // 其他情况,比如括号等
}char* ExchangeToPost(char* Expr) {Stack S;S = CreateStack(100);int length = strlen(Expr);char* result = (char*)malloc(sizeof(char) * (length + 1));int i = 0;int j = 0;int k = 0;while (Expr[i] != '\0') {if (Expr[i] == ' ') {i++;}else if (isdigit(Expr[i])) {result[j] = Expr[i];//printf("case digital: result[%d]: %c\n", j, result[j]);j++;i++;}else if (Expr[i] == '(') {Push(S, Expr[i]);i++;}else if (Expr[i] == ')') {//print_s(S);char temp = Pop(S);while (temp != '(') {result[j] = temp;//printf("case ')': result[%d]: %c\n", j, result[j]);j++;temp = Pop(S);}i++;}else {if (IsEmpty(S)) {Push(S, Expr[i]);i++;continue;}char temp = Pop(S);if (temp == '(') {Push(S, temp);Push(S, Expr[i]);i++;continue;}if (precedence(Expr[i]) > precedence(temp)) {//printf("case opr: result[%d]: %c\n", j, result[j]);Push(S, temp);Push(S, Expr[i]);i++;}else {while (precedence(Expr[i]) <= precedence(temp)){result[j] = temp;//printf("case opr: result[%d]: %c\n", j, result[j]);j++;temp = Pop(S);}Push(S, temp);Push(S, Expr[i]);i++;}}//printf("i: %d, j: %d\n", i, j);//print_s(S);}while (!IsEmpty(S)) {result[j] = Pop(S);j++;}result[j] = '\0';return result;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一练:LeeCode-654、最大二叉树【二叉树+DFS+分治】

本文是力扣LeeCode-654、最大二叉树【二叉树DFS分治】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其…

python安装cv2失败

问题:安装cv2包失败 解决方法&#xff1a; pip install opencv-python或在Anaconda中conda install opencv-python

你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

你好&#xff0c;C&#xff08;11&#xff09;如何用string数据类型表示一串文字&#xff1f;根据初始值自动推断数据类型的auto关键字&#xff08;&#xff23; 11&#xff09; 3.5.2 字符串类型 使用char类型的变量我们可以表示单个字符&#xff0c;那么&#xff0c;我们又…

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…

C语言——oj刷题——模拟实现库函数strlen

目录 方法一&#xff1a;迭代法 方法二&#xff1a;递归法 方法三&#xff1a;指针算术法 方法四&#xff1a;汇编指令法 当我们使用C语言进行字符串操作时&#xff0c;经常会用到库函数strlen来获取字符串的长度。strlen函数的作用是计算一个以null字符结尾的字符串的长度…

六、java高级-泛型(一)

六、泛型 1、泛型 从什么是泛型、泛型从何而来、泛型出现是为了解决什么问题、功能及作用说泛型 1.1什么是泛型&#xff1f; 泛型&#xff1a;即“参数化类型”&#xff0c;也就是将需要操作对象的类型进行参数化。在编写代码的时候&#xff0c;不必声明操作对象&#xff08;…

docker从入门到入土

docker到底是什么&#xff1f; docker是世界领先的软件容器平台&#xff0c;基于GO语言进行开发实现docker能够自动执行重复性任务&#xff0c;例如搭建和配置开发环境&#xff0c;从而解放开发人员用户可以方便地创建和使用容器&#xff0c;把自己的应用放入容器&#xff0c;…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

int VS Integer

在Java中&#xff0c;int 是一种基本数据类型&#xff08;primitive type&#xff09;&#xff0c;而 Integer 是 int 的包装类&#xff08;wrapper class&#xff09;。它们之间的主要区别在于以下几点&#xff1a; 数据类型&#xff1a;int 是基本的整数类型&#xff0c;它在…

Linux gzip命令教程:如何有效地压缩和解压文件(附实例详解和注意事项)

Linux gzip命令介绍 gzip&#xff08;GNU zip&#xff09;是一种在Linux系统中常见的命令行压缩工具。它使用DEFLATE压缩算法来减小文件的大小&#xff0c;使文件更易于存储和传输。gzip主要用于压缩文本文件、Tar归档文件和网页。不建议使用gzip来压缩图像、音频、PDF文档和其…

【P1506 拯救oibh总部】

拯救oibh总部 题目背景 oibh 总部突然被水淹没了&#xff01;现在需要你的救援…… 题目描述 oibh 被突来的洪水淹没了&#xff0c;还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示&#xff0c;而一个四面被围墙围住的区域洪水是进不去的。 oibh 总部内部也有许…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

JS逆向手记01__前端基础

系列文章目录 系列手记占位 文章目录 系列文章目录前言一、js自执行函数语法二、js变量类型的转换&#xff08;与字符串相加&#xff09;三、浏览器环境&#xff08;BOM&#xff09;四、html渲染环境&#xff08;DOM&#xff09;五、html发起请求&#xff08;表单form&#xf…

书生·浦语大模型第四课作业

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 1.安装 # 如果你是在 Int…

Java是如何实现的平台无关?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、什么是平台无关性 平台无关性就是一种语言在…

寒假作业

手写盗版微信登入界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(421,575);this->setFixedSize(421,575);th…

C#系列-C#EF框架实现雪花主键(20)

在C#中&#xff0c;使用Entity Framework (EF) 框架并不直接涉及到主键的生成策略。主键的生成通常是在数据库层面或者在应用程序层面处理的。雪花主键&#xff08;Snowflake ID&#xff09;是一种在分布式系统中生成唯一ID的算法&#xff0c;它通常是由Twitter的雪花算法演变而…

接口测试框架分析

框架大体上已经写完了&#xff0c;不过说实话好多代码让我自己写我也写不出来&#xff0c;那该怎么办呢&#xff1f;很简单&#xff0c;把现在已经写好的代码保存起来&#xff0c;等用的时候拿出来复制粘贴就好了&#xff0c;如果你是大神&#xff0c;自己会写&#xff0c;那就…

TikTok:短视频时代的崛起

导言&#xff1a; TikTok&#xff0c;作为一款全球短视频社交应用&#xff0c;正风靡全球&#xff0c;引领着数字娱乐的新潮流。其简洁的用户界面、创意无限的短视频内容&#xff0c;以及强大的社交互动功能&#xff0c;使其成为全球数以亿计的用户喜爱的平台。 TikTok的特点&a…