如何在 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 的输出 的相关文章

随机推荐

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

    我设置了 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