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

news2024/11/26 9:37:49

目录

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. 资源地址

等待资源审核完毕我再更,也可以直接去我的主页找。

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

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

相关文章

BACnet/IP协议采集网关支持modbus RTU采集

楼宇自动化在现代建筑中扮演着重要的角色&#xff0c;它可以集成和控制各种设备和系统&#xff0c;提高建筑的能效和舒适性。然而&#xff0c;不同的设备和系统通常使用不同的通信协议&#xff0c;这给楼宇自动化的实施带来了一定的挑战。为了解决这个问题&#xff0c;BACnet和…

怎样使用 NFTScan Solana API 快速创建 NFT 应用程序?

之前&#xff0c;Solana 凭借其超高的性能和低廉的费用&#xff0c;已然成为 NFT 项目最青睐的公链之一&#xff0c;众多知名 NFT 项目如 DeGods、Okay Bears、Degenerate Ape Academy 等都选择在 Solana 上发行。意味着 Solana 链上每天都会产生海量的 NFT 交易数据&#xff0…

路由器和路由到底啥区别?

在Vue中会有路由&#xff08;Route&#xff09;的概念&#xff0c;一些伙伴还不知道嘞&#xff0c;这就给大家讲解一下 我们日常出行都会碰到导航这个概念。 导航系统会给出从当前位置到目标位置的建议路径,这就是路由。 而 GPS 导航仪根据路由提供的路径,告诉我们每个路口是…

十七,IBL-打印各个Mipmap级别的hdr环境贴图

预滤波环境贴图类似于辐照度图&#xff0c;是预先计算的环境卷积贴图&#xff0c;但这次考虑了粗糙度。因为随着粗糙度的增加&#xff0c;参与环境贴图卷积的采样向量会更分散&#xff0c;导致反射更模糊&#xff0c;所以对于卷积的每个粗糙度级别&#xff0c;我们将按顺序把模…

计算机等级考试—信息安全三级真题七

目录 一、单选题 二、填空题 三、综合题 一、单选题

SAP从入门到放弃系列之QM主检验特征

文章目录 一、概述二、系统操作2.1、创建主检验特征-QS212.1.1、初始界面2.1.2、 内容页面控制数据一般信息 2.2、主检验特征有效期管理和历史管理 一、概述 检验特征是对检验内容的描述。很多相同的产品的检验内容是由重复和相通性的&#xff0c;所以将这一类在物料的检验任务…

chalk

今天在看antd-design&#xff0c;发现一个叫chalk的东西 https://juejin.cn/post/6973102969076219941https://juejin.cn/post/6973102969076219941

算法通过村第十关-并归|黄金笔记|手撕并归排序

文章目录 前言并归排序的原理总结 前言 提示&#xff1a;有时我会担心你们发现我其实很普通。爱并不需要你与众不同。--查理麦克西《男孩、鼹鼠、狐狸和马》 并归排序算是经典的分治思想中的问题&#xff0c;这个非常典型的题目。 并归排序的原理 并归排序&#xff0c;简单来说…

预测算法6|BP_adaboost算法原理及其实现

BPNN是一种根据误差反向传播算法训练的多层前馈网络&#xff0c;具有很强的非线性处理能力&#xff0c;是目前应用最广泛的神经网络之一。但BPNN的泛化能力相对较差&#xff0c;在优化过程中易陷入局部极小值&#xff0c;同时&#xff0c;它的鲁棒性差&#xff0c;学习过程的收…

【考研数学】概率论与数理统计 —— 第三章 | 二维随机变量及其分布(1,二维连续型和离散型随机变量基本概念与性质)

文章目录 引言一、二维随机变量及分布1.1 基本概念1.2 联合分布函数的性质 二、二维离散型随机变量及分布三、多维连续型随机变量及分布3.1 基本概念3.2 二维连续型随机变量的性质 写在最后 引言 隔了好长时间没看概率论了&#xff0c;上一篇文章还是 8.29 &#xff0c;快一个…

一个人可以开发游戏吗?

在今天的数字时代&#xff0c;游戏产业已经成为全球最具活力的领域之一。从大型游戏开发工作室到独立游戏制作人&#xff0c;游戏开发已经变得更加多样化和容易进入。然而&#xff0c;对于许多梦想成为游戏开发者的人来说&#xff0c;一个关键问题一直挥之不去&#xff1a;一个…

组网行动指南:打造对跨国企业友好的专用网络环境

在全球数字化转型的浪潮下&#xff0c;越来越多的企业跨国发展业务&#xff0c;由于跨域网络的复杂性和自建网络架构的各种限制&#xff0c;导致分散在不同地理位置的站点无法实现数据互通和协作。 跨国企业组网常见痛点 痛点一&#xff1a;自建网络方案经常掉线&#xff0c;影…

No128.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

CompletableFuture-线程池运行选择

如果没有传入自定义线程池&#xff0c;都用默认线程池ForkJoinPool 传入一个线程池&#xff0c;如果你执行第一个任务时&#xff0c;传入了一个自定义线程池&#xff0c; 调用thenRun方法执行第二个任务时&#xff0c;则第二个任务和第一个任务时共用同一个线程池 调用thenRun…

26559-2021 机械式停车设备 分类

声明 本文是学习GB-T 26559-2021 机械式停车设备 分类. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了机械式停车设备的分类及有关的型式、型号和适停汽车组别、尺寸及质量。 本文件适用于 GB/T 3730.1—2001定义的乘用车及商用…

K8sGPT,基于 AI 的云原生终极工具

随着人工智能和机器学习的兴起&#xff0c;企业和组织越来越多地寻找创新方法来利用这些技术来获得竞争优势。 该领域最强大的工具之一便是 K8sGPT&#xff0c;即基于 Kubernetes 的 GPT&#xff0c;它将 Kubernetes 编排的优势与 GPT 模型的高级自然语言处理能力结合在一起。 …

人工智能AI 全栈体系(八)

第一章 神经网络是如何实现的 神经网络只是提供了一个一般性方法&#xff0c;具体用它求解什么问题&#xff0c;根据问题的特点&#xff0c;定义好输入输出以及损失函数就可以了。 在介绍神经网络语言模型结构的时候&#xff0c;每个词 w 都对应一个长度为 m 的向量 C(w)&…

深度学习(1)---卷积神经网络

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

化妆品微针贴片,全球市场总体规模,前12大厂商排名及市场份额

化妆品微针贴片全球市场总体规模 化妆品微针贴片是一种新型的美容护肤产品&#xff0c;它采用微针技术&#xff0c;将微针嵌入贴片中&#xff0c;通过将贴片贴在皮肤表面&#xff0c;使微针穿透皮肤表层&#xff0c;将活性成分输送到皮肤深层&#xff0c;从而达到美容护肤的效…

LeetCode【2251. 花期内花的数目】

给你一个下标从 0 开始的二维整数数组 flowers &#xff0c;其中 flowers[i] [starti, endi] 表示第 i 朵花的 花期 从 starti 到 endi &#xff08;都 包含&#xff09;。同时给你一个下标从 0 开始大小为 n 的整数数组 people &#xff0c;people[i] 是第 i 个人来看花的时间…