如何在 C# 中使用堆栈计算 Infix-Expression 的输出

2024-01-07

我已经在 Stackoverflow 上找到了不同的解决方案,但有些事情我不明白。

计算输出的最佳方法是什么,例如: ((1+(4*(2+3)))+((2+3)*(4*5))) ?

我的方法如下,但我知道其中有很多错误:

public static int ComputeInfix(string infix) {
        Stack<char> operatorstack = new Stack<char>();
        Stack<int> operandstack = new Stack<int>();
        for(int j = 0; j < infix.Length; j++) {
            char c = infix[j];
            if (c => 0 && c <= 9) {
                operandstack.Push(c);
            }
            else if ((c == '+' || c == '*' ||  c == '/' || c == '-')) {
                if (operatorstack.IsEmpty()) {
                    operatorstack.Push(c);
                }
                else {
                    if (operatorstack.Peek() != '*' || operatorstack.Peek() != '/') {
                        operatorstack.Push(c);
                    }
                }
            } 
            else if (c == '(') {
                operatorstack.Push(c);
            }
            else if (c == ')') {
                operatorstack.Pop();
            }
        }
        return infix;
    }

现在改为:

Stack<char> operatorstack = new Stack<char>();
        Stack<char> operandstack = new Stack<char>();
        for(int j = 0; j < infix.Length; j++) {
            char c = infix[j];
            if (c => '0' && c <= '9') {
                operandstack.Push(c);
            }

但得到错误:

Infix.cs(16,8):错误CS0136:名为的局部变量c' cannot be declared in this scope because it would give a different meaning to c',它已经在“父级或当前”范围中使用来表示 别的东西


由于我花了时间写它,所以这是我的解决方案:

public static int ComputeInfix(string infix) {
    var operatorstack = new Stack<char>();
    var operandstack = new Stack<int>();

    var precedence = new Dictionary<char, int> { { '(', 0 }, { '*', 1 }, { '/', 1 }, { '+', 2 }, { '-', 2 }, { ')', 3 } };

    foreach (var ch in $"({infix})") {
        switch (ch) {
            case var digit when Char.IsDigit(digit):
                operandstack.Push(Convert.ToInt32(digit.ToString()));
                break;
            case var op when precedence.ContainsKey(op):
                var keepLooping = true;
                while (keepLooping && operatorstack.Count > 0 && precedence[ch] > precedence[operatorstack.Peek()]) {
                    switch (operatorstack.Peek()) {
                        case '+':
                            operandstack.Push(operandstack.Pop() + operandstack.Pop());
                            break;
                        case '-':
                            operandstack.Push(-operandstack.Pop() + operandstack.Pop());
                            break;
                        case '*':
                            operandstack.Push(operandstack.Pop() * operandstack.Pop());
                            break;
                        case '/':
                            var divisor = operandstack.Pop();
                            operandstack.Push(operandstack.Pop() / divisor);
                            break;
                        case '(':
                            keepLooping = false;
                            break;
                    }
                    if (keepLooping)
                        operatorstack.Pop();
                }
                if (ch == ')')
                    operatorstack.Pop();
                else
                    operatorstack.Push(ch);
                break;
            default:
                throw new ArgumentException();
        }
    }

    if (operatorstack.Count > 0 || operandstack.Count > 1)
        throw new ArgumentException();

    return operandstack.Pop();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 中使用堆栈计算 Infix-Expression 的输出 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 带魔杖的谷歌云功能停止工作

    我设置了 3 个 Google Cloud Storge 存储桶和 3 个函数 每个存储桶一个 当 PDF 文件上传到存储桶时将触发这些函数 函数将 PDF 转换为 png 图像并进行进一步处理 当我尝试创建第四个存储桶和类似的功能时 奇怪
  • Keras:“运行时错误:无法导入 pydot。”安装 graphviz 和 pydot 后

    我在 Windows 10 上使用 Anaconda Python 2 7 我计划进行 Keras 可视化 因此 当间谍程序打开时 我打开了 Anaconda 命令提示符并 pip 安装了 graphviz 和 pydot 现在 当我尝试运
  • 区分扫描仪和键盘

    大家好 我有一台条形码扫描仪连接到一台使用 c 程序的 PC 现在我想区分扫描仪和键盘 哪一个正在向我的程序发送数据 每个人都可以帮助我编写 c 代码或提供建议吗 有人在另一个主题中对我说了这句话 但我还不能这样做 基本上 您可以配置扫描仪
  • Glassfish 服务器不支持 JDK 8

    我在 NetBeans 的 Web 项目中使用带有 lambda 的 jdk 8 但是当将其部署到 glassfish 时 它向我显示以下错误 java lang RuntimeException Uncompilable source c
  • 当字符串文字改变时会发生什么? [复制]

    这个问题在这里已经有答案了 我想将字符串文字更改为全大写 这是我的代码 a and b are the same literal String a Test String b Test now I want to change all b
  • 创建自定义 UIView 并在 Swift 中显示为弹出窗口

    我正在尝试创建一个自定义UIView并使用 Swift 在我的主视图中将其显示为弹出窗口 我的定制UIView代码是 class DatePopUpView UIView var uiView UIView override init su
  • 带有 LLVM 的 C ABI

    我有一个用 LLVM 编写的编译器 我希望提高 ABI 合规性 例如 我发现很难在 Windows x86 或 Linux 上实际找到 C ABI 的规范文档 我发现的那些用 RAX EAX 等术语解释它 而不是我可以使用的 IR 术语 到
  • 如何:动态移动 Google Gauge?

    观察 CPU 和内存指标 http code google com apis visualization documentation gallery gauge html Loading一会儿 它们动态地移动 下面显示的示例代码不会像那样移
  • 来自 nginx/passenger 的“从应用程序收到的响应不完整”

    我尝试通过 capistrano 在 nginx 和 ubuntu 上部署我的 Rails 应用程序 就像页面上的教程一样https gorails com deploy ubuntu 14 04 https gorails com dep
  • Java 8 替代 Map.entry() 将值映射到新 Map?

    我找到了解决长期以来一直试图解决的问题的解决方案 不幸的是 我无法使用该解决方案 因为目标 java 版本是 Java 8 Map
  • 如何在大型 SQL Server 查询中使用多个核心?

    我有两台 SQL Server 一台用于生产 一台用作存档 每天晚上 我们都会运行一个 SQL 作业并将当天的生产数据复制到存档中 随着我们的成长 这个过程需要的时间越来越长 当我观察运行归档进程的归档服务器上的利用率时 我发现它只使用单个
  • C# 中的 Jaro–Winkler 距离算法

    如何在 C 中实现 Jaro Winkler 距离字符串比较算法 public static class JaroWinklerDistance The Winkler modification will not be applied un
  • 使用 log4j 编写审核日志

    我有一个应用程序需要写入两种不同类型的日志 应用程序日志和审核日志 应用程序日志用于调试目的 而审核日志用于记录所执行的操作 两个日志将位于不同的文件中 每个文件应仅包含上述日志 意味着审核日志文件不能包含应用程序日志 反之亦然 如何使用
  • 在 Node.js 中缓存数据最便宜的方法?

    我正在实现一个运行匹配算法的 Node js 服务器 由于我希望服务器尽快响应 因此我希望能够从缓存中检索数据 而不是每次都查询数据库 例如 我需要保留 10000 50000 个用户的信息 我担心这会占用大量内存 有没有什么方法可以将这么
  • Nodemailor 无法跨域发送电子邮件

    我正在使用 NodeMailor 通过 Node 和 Express 应用程序发送电子邮件 问题 当我跨域发送电子邮件时 例如 我正在使用 Hostgator 电子邮件服务器 它仅使用 Hostgator 在托管电子邮件上发送电子邮件 但当
  • 如何使用 htaccess 强制使用 http- 而不是 https

    我的整个域有一个目录 我想强制使用 https 即 docs 在 docs 文件夹中 我有以下 htaccess 文件 RewriteEngine On RewriteCond HTTPS on RewriteRule https HTTP
  • 在 ngIf 内动态添加组件

    我有一些代码可以动态地向我的页面之一添加 删除组件 这似乎工作得很好 我的方法基于 Rob Wormald 的很棒的方法NG2 高级讲座 https www youtube com watch v ZqGvilzDbac 以标准方式做事看起
  • html文本框的最大长度是多少

    任何人都可以帮助我确定普通 HTML 文本框中可以包含的最大字符长度 至于 HTML 方面 当maxlength未指定属性 则输入值的最大长度不受限制 但是 如果您将请求发送为GET代替POST 那么限制将取决于 Web 浏览器和 Web
  • 如何使用 Boost.Asio 解析主机(仅)?

    根据文档 http www boost org doc libs 1 36 0 doc html boost asio reference ip basic resolver query basic resolver query html
  • 如何在 C# 中使用堆栈计算 Infix-Expression 的输出

    我已经在 Stackoverflow 上找到了不同的解决方案 但有些事情我不明白 计算输出的最佳方法是什么 例如 1 4 2 3 2 3 4 5 我的方法如下 但我知道其中有很多错误 public static int ComputeInf