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

中缀表达式转后缀表达式

1.声明队列Expressions,和堆栈Operators ,并定义优先级:

( 和 ):3

* 和/ : 2

+ 和 - :1 

数值越大,优先级越高


foreach(每一个计算单元 in 当前中缀表达式)

{


2.遇到数字直接进队列

3.遇到左括号 '('直接进堆栈

4.遇到右括号

while(栈顶元素!=左括号)

{

入队列

弹出

}

弹出(为了弹出左括号)


5.遇到操作符


while(堆栈非空 AND 当前元素优先级 <= 栈顶元素优先级 AND 栈顶元素 != 左括号)

{

栈顶元素入队列

弹出栈顶元素

}


当前操作符入栈

}

6.弹出所有栈内操作符,入队列(别忘了还有哥们没入队呢!)


C# 完整实现:

private const string StartScope = "(";
        private const string EndScrope = ")";
        private const int MinPrior = -1;
        private const int NotSupportedOperator = -3;
        private const int FatalError = -4;

 public string[] ConvertToRpn(string[] strArr)
        {
            var operators = new Stack<string>();
            var expression = new Queue<string>();
            foreach (var str in strArr)
            {
                if (IsNum(str))
                    expression.Enqueue(str);
                else switch (str)
                    {
                        case StartScope:
                            operators.Push(str);
                            break;
                        case EndScrope:
                            {
                                if (operators.Count == 0)
                                    return null;

                                while (operators.Count > 0 && operators.Peek() != StartScope)
                                {
                                    expression.Enqueue(operators.Peek());
                                    operators.Pop();
                                }
                                operators.Pop();
                            }
                            break;
                        default:
                            if (IsSupportedOperator(str))
                            {
                                var stackPrior = operators.Count == 0 ? MinPrior : OperatorPriority(operators.Peek());
                                var elementPrior = OperatorPriority(str);

                                if (elementPrior <= stackPrior)
                                {
                                    while (operators.Count > 0 && OperatorPriority(operators.Peek()) >=
                                                                  elementPrior && operators.Peek() != StartScope)
                                    {
                                        expression.Enqueue(operators.Peek());
                                        operators.Pop();
                                    }
                                }
                                operators.Push(str);
                            }
                            break;
                    }


            }
            while (operators.Count > 0)
            {
                expression.Enqueue(operators.Peek());
                operators.Pop();
            }
            return expression.ToArray();
        }

 private bool IsNum(string str)
        {
            double rlt;
            return double.TryParse(str, out rlt);
        }


        private int OperatorPriority(string op)
        {
            switch (op)
            {
                case "+":
                case "-":
                    return 1;
                case "*":
                case "/":
                    return 2;
                case StartScope:
                case EndScrope:
                    return 3;
                default:
                    return MinPrior;
            }
        }


        private bool IsSupportedOperator(string str)
        {
            var supportedOps = new[] { "+", "-", "*", "/" };
            return supportedOps.Contains(str);
        }


相关文章:

  • wxGlade wxFormBuilder
  • 价值驱动:移动支付的推手
  • 赖床随想记录
  • 世博会助中移动从3G迈向4G
  • 《中关村两个男人的斗争》外传——西直门
  • JavaScript 面向对象的使用
  • Symbian下自动切换SDK的批处理代码
  • [Web开发] 在线 Javascript 代码格式美化工具
  • 如果浏览器是女人……
  • C#几种常用的排序算法
  • DFS测试_引用状态持续缓存时间
  • “139邮箱”练好内功比发电影票更重要
  • 7 个效果震憾的 HTML5 应用组件
  • 校内网是如何赚钱的
  • 前端开发攻城师不可忽视的五个HTML5新特性
  • $translatePartialLoader加载失败及解决方式
  • [nginx文档翻译系列] 控制nginx
  • C学习-枚举(九)
  • javascript 总结(常用工具类的封装)
  • leetcode-27. Remove Element
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • SAP云平台里Global Account和Sub Account的关系
  • vuex 学习笔记 01
  • webpack+react项目初体验——记录我的webpack环境配置
  • 创建一个Struts2项目maven 方式
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 今年的LC3大会没了?
  • 如何解决微信端直接跳WAP端
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Spring第一个helloWorld
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #14vue3生成表单并跳转到外部地址的方式
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (14)Hive调优——合并小文件
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Git) gitignore基础使用
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (九)One-Wire总线-DS18B20
  • (论文阅读30/100)Convolutional Pose Machines
  • (四) 虚拟摄像头vivi体验
  • (学习日记)2024.01.09
  • (一)appium-desktop定位元素原理
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net 4.0发布后不能正常显示图片问题
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Micro Framework初体验(二)
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .Net多线程总结
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET下的多线程编程—1-线程机制概述
  • @GetMapping和@RequestMapping的区别