当前位置: 首页 > news >正文

前缀、中缀、后缀表达式相互转换工具

目录

1. 界面一览

2. 使用说明

3. 实例演示

3.1 输入中缀

3.2 输入前缀

3.3 输入后缀

3.4 选择错误的类型

4. 代码

5. 资源地址


关于什么是前缀、中缀、后缀表达式,相信你不知道这个东西,那你也不会点进来这篇博客,当然,我刚刚也有写一个简单的介绍(前缀、中缀、后缀表达式介绍)。

1. 界面一览


2. 使用说明

你需要选择你输入的值是什么表达式类型,本来我是想要写一个自动检测输入的表达式是属于哪一种,但是奈何能力有限,搞了大半天都没搞出来,立即推,果断放弃,转换思路,让你自己选,总不能你自己都不知道你输的是啥吧哈哈哈。

在你输入得到时候,如果输入空格和中文的圆括号,后台会自动操作,不必担心,这也是为了方便自己,懒得输入法来回切换了,果然,懒惰是人类进步的动力。

上面黄色背景的是简单的举例,不用你自己再去算了,至于计算的功能,我没写,这个玩意随便一个 IDE 都能实现。

点击开始转换就会进行转换,根据你的选择的不同,会显示不同的结果,具体请看下面的实例演示。

输入值之后直接回车,也会触发转换,省去点击按钮的时间。

清空和关闭想必不用我多说了吧。

隐藏功能:这个功能会记住及上次移动的位置,不会每次都出现在固定的位置,方便每个人的操作。


3. 实例演示

3.1 输入中缀


3.2 输入前缀


3.3 输入后缀


3.4 选择错误的类型


4. 代码

using System;
using System.Collections.Generic;
using System.Windows.Forms;namespace TypeConversion
{public partial class frmChangeType : Form{public frmChangeType(){InitializeComponent();}/// <summary>/// 清空/// </summary>private void btnClear_Click(object sender, EventArgs e){txtInPut.Text = "";txtA2B.Text = "";lblA2B.Text = "待转换:";txtA2C.Text = "";lblA2C.Text = "待转换:";}/// <summary>/// 窗体加载/// </summary>private void Form1_Load(object sender, EventArgs e){cboType.Items.Add("前缀");cboType.Items.Add("中缀");cboType.Items.Add("后缀");cboType.SelectedIndex = 1;btnClear_Click(sender, e);txtInPut.KeyPress += txtInPut_KeyPress;// 将文本框的 KeyPress 事件与事件处理程序关联// 从应用程序设置中加载窗体位置if (Properties.Settings.Default.WindowLocation != null){this.Location = Properties.Settings.Default.WindowLocation;}}/// <summary>/// 窗体关闭自动保存上次窗体所在的位置/// </summary>protected override void OnFormClosing(FormClosingEventArgs e){base.OnFormClosing(e);// 保存窗体位置到应用程序设置Properties.Settings.Default.WindowLocation = this.Location;Properties.Settings.Default.Save();}/// <summary>/// 输入文本回车触发事件/// </summary>private void txtInPut_KeyPress(object sender, KeyPressEventArgs e){// 判断按下的键是否是回车键if (e.KeyChar == (char)Keys.Enter){btnChange_Click(sender, e);}}/// <summary>/// 转换按钮/// </summary>private void btnChange_Click(object sender, EventArgs e){// 获取当前选中的值string selectedValue = cboType.SelectedItem.ToString();// 记录返回结果string result;// 去除所有空格string sInPut = txtInPut.Text.Replace(" ", "");// 替换中文括号为英文括号sInPut = sInPut.Replace("(", "(").Replace(")", ")");if (sInPut == ""){MessageBox.Show("请输入值!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}ChangeMethods chmth = new ChangeMethods();try{if (selectedValue == "前缀"){result = chmth.ConvertPrefixToInfix(sInPut);lblA2B.Text = "前转中:";txtA2B.Text = result;result = chmth.ConvertPrefixToPostfix(sInPut);lblA2C.Text = "前转后:";txtA2C.Text = result;}else if (selectedValue == "中缀"){result = chmth.ConvertInfixToPrefix(sInPut);lblA2B.Text = "中转前:";txtA2B.Text = result;result = chmth.ConvertInfixToPostfix(sInPut);lblA2C.Text = "中转后:";txtA2C.Text = result;}else if (selectedValue == "后缀"){result = chmth.ConvertPostfixToPrefix(sInPut);lblA2B.Text = "后转前:";txtA2B.Text = result;result = chmth.ConvertPostfixToInfix(sInPut);lblA2C.Text = "后转中:";txtA2C.Text = result;}}catch (Exception ex){MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Information);}}/// <summary>/// 关闭按钮/// </summary>private void btnClose_Click(object sender, EventArgs e){Close();}}
}/// <summary>
/// 转换的具体方法
/// </summary>
public class ChangeMethods
{public bool IsOperand(char c){return Char.IsLetterOrDigit(c);}/// <summary>/// 判定操作数/// </summary>public bool IsOperator(char c){return c == '+' || c == '-' || c == '*' || c == '/';}/// <summary>/// 前转中/// </summary>public string ConvertPrefixToInfix(string sInPut){Stack<string> stack = new Stack<string>();try{// 从右到左遍历前缀表达式for (int i = sInPut.Length - 1; i >= 0; i--){char c = sInPut[i];if (IsOperator(c)){// 弹出两个操作数string operand1 = stack.Pop();string operand2 = stack.Pop();// 构建中缀表达式string infix = "(" + operand1 + c + operand2 + ")";// 将中缀表达式入栈stack.Push(infix);}else{// 将操作数入栈stack.Push(c.ToString());}}// 栈顶元素即为转换后的中缀表达式return stack.Pop();}catch (Exception ex){throw new Exception("前缀表达式转中缀表达式时发生异常: " + ex.Message);}}/// <summary>/// 前转后/// </summary>public string ConvertPrefixToPostfix(string sInPut){Stack<string> stack = new Stack<string>();try{// 从右到左遍历前缀表达式for (int i = sInPut.Length - 1; i >= 0; i--){char c = sInPut[i];if (IsOperator(c)){// 弹出两个操作数string operand1 = stack.Pop();string operand2 = stack.Pop();// 构建后缀表达式string postfix = operand1 + operand2 + c;// 将后缀表达式入栈stack.Push(postfix);}else{// 将操作数入栈stack.Push(c.ToString());}}// 栈顶元素即为转换后的后缀表达式return stack.Pop();}catch (Exception ex){throw new Exception("前缀表达式转后缀表达式时发生异常: " + ex.Message);}}/// <summary>/// 中转前/// </summary>public string ConvertInfixToPrefix(string infixExpression){Stack<char> operatorStack = new Stack<char>();Stack<string> operandStack = new Stack<string>();try{// 遍历中缀表达式for (int i = 0; i < infixExpression.Length; i++){char c = infixExpression[i];if (c == ' '){continue;}else if (Char.IsLetterOrDigit(c)){// 操作数直接入栈operandStack.Push(c.ToString());}else if (c == '('){// 左括号直接入栈operatorStack.Push(c);}else if (c == ')'){// 右括号,弹出操作符和操作数,构建前缀表达式while (operatorStack.Count > 0 && operatorStack.Peek() != '('){char op = operatorStack.Pop();string operand2 = operandStack.Pop();string operand1 = operandStack.Pop();string prefix = op + operand1 + operand2;operandStack.Push(prefix);}// 弹出左括号operatorStack.Pop();}else{// 操作符,根据优先级处理while (operatorStack.Count > 0 && operatorStack.Peek() != '(' && GetOperatorPriority(c) <= GetOperatorPriority(operatorStack.Peek())){char op = operatorStack.Pop();string operand2 = operandStack.Pop();string operand1 = operandStack.Pop();string prefix = op + operand1 + operand2;operandStack.Push(prefix);}// 当前操作符入栈operatorStack.Push(c);}}// 处理剩余的操作符和操作数while (operatorStack.Count > 0){char op = operatorStack.Pop();string operand2 = operandStack.Pop();string operand1 = operandStack.Pop();string prefix = op + operand1 + operand2;operandStack.Push(prefix);}// 栈顶元素即为转换后的前缀表达式return operandStack.Pop();}catch (Exception ex){throw new Exception("中缀表达式转前缀表达式时发生异常: " + ex.Message);}}/// <summary>/// 中转后/// </summary>public string ConvertInfixToPostfix(string infixExpression){Stack<char> operatorStack = new Stack<char>();List<string> postfixList = new List<string>();try{// 遍历中缀表达式for (int i = 0; i < infixExpression.Length; i++){char c = infixExpression[i];if (c == ' '){continue;}else if (Char.IsLetterOrDigit(c)){// 操作数直接加入后缀表达式列表postfixList.Add(c.ToString());}else if (c == '('){// 左括号直接入栈operatorStack.Push(c);}else if (c == ')'){// 右括号,弹出操作符,将操作符加入后缀表达式列表while (operatorStack.Count > 0 && operatorStack.Peek() != '('){postfixList.Add(operatorStack.Pop().ToString());}// 弹出左括号operatorStack.Pop();}else{// 操作符,根据优先级处理while (operatorStack.Count > 0 && operatorStack.Peek() != '(' && GetOperatorPriority(c) <= GetOperatorPriority(operatorStack.Peek())){postfixList.Add(operatorStack.Pop().ToString());}// 当前操作符入栈operatorStack.Push(c);}}// 将剩余的操作符加入后缀表达式列表while (operatorStack.Count > 0){postfixList.Add(operatorStack.Pop().ToString());}// 将后缀表达式列表转换为字符串string postfixExpression = string.Join("", postfixList);return postfixExpression;}catch (Exception ex){throw new Exception("中缀表达式转后缀表达式时发生异常: " + ex.Message);}}/// <summary>/// 后转前/// </summary>public string ConvertPostfixToPrefix(string postfixExpression){Stack<string> stack = new Stack<string>();try{// 遍历后缀表达式for (int i = 0; i < postfixExpression.Length; i++){char c = postfixExpression[i];if (IsOperator(c)){// 弹出两个操作数string operand2 = stack.Pop();string operand1 = stack.Pop();// 构建前缀表达式string prefix = c + operand1 + operand2;// 将前缀表达式入栈stack.Push(prefix);}else{// 将操作数入栈stack.Push(c.ToString());}}// 栈顶元素即为转换后的前缀表达式return stack.Pop();}catch (Exception ex){throw new Exception("后缀表达式转前缀表达式时发生异常: " + ex.Message);}}/// <summary>/// 后转中/// </summary>public string ConvertPostfixToInfix(string postfixExpression){Stack<string> stack = new Stack<string>();try{// 遍历后缀表达式for (int i = 0; i < postfixExpression.Length; i++){char c = postfixExpression[i];if (IsOperator(c)){// 弹出两个操作数string operand2 = stack.Pop();string operand1 = stack.Pop();// 构建中缀表达式string infix = "(" + operand1 + c + operand2 + ")";// 将中缀表达式入栈stack.Push(infix);}else{// 将操作数入栈stack.Push(c.ToString());}}// 栈顶元素即为转换后的中缀表达式return stack.Pop();}catch (Exception ex){throw new Exception("后缀表达式转中缀表达式时发生异常: " + ex.Message);}}/// <summary>/// 获取操作数优先级/// </summary>public int GetOperatorPriority(char op){switch (op){case '+':case '-':return 1;case '*':case '/':return 2;default:return 0;}}
}

5. 资源地址

代码

相关文章:

前缀、中缀、后缀表达式相互转换工具

目录 1. 界面一览 2. 使用说明 3. 实例演示 3.1 输入中缀 3.2 输入前缀 3.3 输入后缀 3.4 选择错误的类型 4. 代码 5. 资源地址 关于什么是前缀、中缀、后缀表达式&#xff0c;相信你不知道这个东西&#xff0c;那你也不会点进来这篇博客&#xff0c;当然&#xff0c;…...

Vue之ElementUI之动态树+数据表格+分页(项目功能)

目录 前言 一、实现动态树形菜单 1. 配置相应路径 2. 创建组件 3. 配置组件与路由的关系 index.js 4. 编写动态树形菜单 5. 页面效果演示 二、实现数据表格绑定及分页功能 1. 配置相应路径 2. 编写数据表格显示及分页功能代码 BookList.vue 3. 演示效果 总结 前言…...

【CAD二次开发】给CAD添加TRUSTEDPATHS避免dll插件信任弹窗

找到配置文件目录,遍历下面的每个配置文件; 找到 Variables 下的TRUSTEDPATHS项目;在后面添加新的目录即可,多个目录使用分号分隔; public static void AddPath(string trusedPath){// 指定注册表键的路径...

编译和链接

编译和链接 一&#xff1a;&#xff1f;&#xff1f;&#xff1f;二&#xff1a;翻译环境1&#xff1a;编译1&#xff1a;预处理2&#xff1a;编译 2&#xff1a;链接 三&#xff1a;运行环境&#xff1a; 本文章所使用的图片均来在yyds鹏哥一&#xff1a;&#xff1f;&#xf…...

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型...

修改npm全局安装的插件(下载目录指向)

我们先打开终端 然后执行 npm config get prefix查看npm 的下载地址 一般都会在C盘 但是 我们都知道 C盘下东西多了是很不好的 所以 我们可以执行 npm config set prefix “E:\npmfile”将 npm 的下载地址 改变成 E盘下的 npmfile目录 这样 以后 默认全局安装的插件就会都到…...

<C++> 异常

C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系统的…...

聊聊HttpClientBuilder

序 本文主要研究一下HttpClientBuilder HttpClientBuilder httpclient-4.5.10-sources.jar!/org/apache/http/impl/client/HttpClientBuilder.java public class HttpClientBuilder {public static HttpClientBuilder create() {return new HttpClientBuilder();}protected…...

MacOS - Sonoma更新了啥

1 系统介绍 苹果公司于2023年9月26日发布了macOS Sonoma 14.0正式版。名称由来不知道&#xff0c;可能是地名&#xff1a;Sonoma是一个地名,指加利福尼亚州北部索诺玛县(Sonoma County)。 2 系统重要更新 2.1 将小组件添加到桌面 速览提醒事项和临近日程等。按住Control键点…...

C++17中头文件filesystem的使用

C17引入了std::filesystem库(文件系统库, filesystem library)&#xff0c;相关类及函数的声明在头文件filesystem中&#xff0c;命名空间为std::filesystem。 1.path类&#xff1a;文件路径相关操作&#xff0c;如指定的路径是否存在等&#xff0c;其介绍参见&#xff1a;http…...

「专题速递」数字人直播带货、传统行业数字化升级、远程协作中的低延时视频、地产物业中的通讯终端...

音视频技术作为企业数字化转型的核心要素之一&#xff0c;已在各行各业展现出广泛的应用和卓越的价值。实时通信、社交互动、高清视频等技术不仅令传统行业焕发新生&#xff0c;还为其在生产、管理、服务提供与维护等各个领域带来了巨大的助力&#xff0c;实现了生产效率和服务…...

PE格式之PE头部

1. PE头部总体组成 2. DOS MZ头 3. PE头 PE头由3部分组成: 下面分别: OptionalHeader比较大: 然后是节表, 节表有多个: PE文件头部就结束了, 最后就是节区了, 来看几段代码: ; main.asm .586 .model flat, stdcall option casemap:noneinclude windows.inc include ke…...

SLAM从入门到精通(用python实现机器人运动控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在ROS下面&#xff0c;开发的方法很多&#xff0c;可以是c&#xff0c;可以是python。大部分接口操作类的应用&#xff0c;其实都可以用python来开…...

接口和抽象类有什么区别?

接口和抽象类都是用于实现抽象类型的机制: 抽象类:抽象类可以包含抽象方法(未实现的方法)和具体方法(已实现的方法)。抽象类可以有字段(成员变量),这些字段可以是具体的,也可以是抽象的。一个类只能继承一个抽象类,Java不支持多继承。抽象类可以拥有构造方法,用于初…...

基于springboot+vue的人事系统

目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 考勤信息管理 考勤信息管理 下班记录管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;作为学校以及一些培训机构&#xff0c;都在用信息…...

记住这份软件测试八股文还怕不能拿offer?你值得拥有

前言 2023秋招即将来临&#xff0c;很多同学会问软件测试面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试…...

2023年,在CSDN拥有10000粉丝有多难?

该数据来源于粉丝数人数排行前5000名用户的关注用户列表中产生的&#xff0c;由于采集样本数有限&#xff0c;数据可能具有一定的误差&#xff0c;仅供参考&#xff0c;本次采样用户数大概在100万以上。 筛选条件人数粉丝人数大于50007519粉丝人数大于100003763粉丝人数大于500…...

C++ -- 学习系列 关联式容器 set 与 map

一 关联式容器是什么&#xff1f; c 中有两种容器类型&#xff1a;关联式容器与序列式容器&#xff08;顺序容器&#xff09; 关联式中的容器是按照关键字来存储与访问的&#xff0c;序列式容器&#xff08;顺序容器&#xff09;则是元素在容器中的相对位置来存储与访问的。…...

Day 04 python学习笔记

Python数据容器 元组 元组的声明 变量名称&#xff08;元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;元素4…….&#xff09; &#xff08;元素类型可以不同&#xff09; eg: tuple_01 ("hello", 1, 2,-20,[11,22,33]) print(type(tuple_01))结果&#x…...

Moonbeam Ignite强势回归

参与Moonbeam上最新的流动性计划 还记得新一轮的流动性激励计划吗&#xff1f;Moonbeam Ignite社区活动带着超过300万枚GLMR奖励来啦&#xff01;体验新项目&#xff0c;顺便薅一把GLMR羊毛。 本次Moonbeam Ignite活动的参与项目均为第二批Moonbeam生态系统Grant资助提案中获…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...