当前位置: 首页 > 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资助提案中获…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...