算数表达式

简单计算器实现

输入一组仅包含“+、-、×”在内的算术表达式,比如“3+2×6+8-2”,用C,VC++,C#,VB,Java,APS.NET等任意一种语言,编写程序,
实现:
在运算符组“+,-,×,(,)”内实现算术表达式,比如“(3+2)×6+8-2”,获取正确的计算结果。
思路:
1、利用栈实现,一个栈存储数字N,一个栈存储算数符号P
2、对每一个字符进行扫描,如果是数字,则将其压入N中,若是算数符号,则压入P中。

2.1、首先是数字,对输入的算数表达式进行一个一个扫描,数字都是单个的,需要进行倍乘

 // 将连续的数字字符转换为整数并压入数字栈
                int number = 0;
                while (i < input.Length && char.IsDigit(input[i]))
                {
                    number = number * 10 + (input[i] - '0');//这里的“input[i] - '0'”是ACSII码的差值,也就是imput【i】的值
                 
                }

2.2、对于“(”直接压入P栈
对于“)”则需要开始计算,直到P栈栈顶为“(”
2.3、对与±*/则需要与P栈顶的符号优先级进行比较,来确定是进栈还是先对栈内数计算后再进栈。

 else if (c == '(')
            {
                // 直接压入运算符栈
                operators.Push(c);
            }
            // 如果当前字符是右括号 ')'
            else if (c == ')')
            {
                // 在遇到右括号时,持续弹出运算符栈顶的运算符并进行计算,直到遇到左括号为止
                while (operators.Peek() != '(')
                {
                    CalculateAndPush(numbers, operators);
                }
                operators.Pop(); // 弹出左括号
            }
            // 如果当前字符是运算符
            else if (IsOperator(c))
            {
                // 当前运算符的优先级小于等于栈顶运算符优先级时,弹出栈顶运算符并进行计算,直到栈顶运算符优先级更低或栈为空
                while (operators.Count > 0 && Precedence(c) <= Precedence(operators.Peek()))
                {
                    CalculateAndPush(numbers, operators);
                }
                // 将当前运算符压入栈
                operators.Push(c);
            }
        }

2.4、最后是计算函数
取N栈顶上两个数和P栈顶上一个算出运算符进行计算

 // 私有辅助方法,用于执行两个数字的运算并将结果压回数字栈
    private static void CalculateAndPush(Stack<int> numbers, Stack<char> operators)
    {
        int right = numbers.Pop(); // 弹出栈顶数字作为右侧操作数
        int left = numbers.Pop(); // 弹出新的栈顶数字作为左侧操作数
        char op = operators.Pop(); // 弹出栈顶运算符

        // 根据运算符执行相应的计算
        switch (op)
        {
            case '+':
                numbers.Push(left + right);
                break;
            case '-':
                numbers.Push(left - right);
                break;
            case '*':
                numbers.Push(left * right);
                break;
            case '/':
                numbers.Push(left / right); // 注意:这里没有处理除数为0的情况
                break;
        }
    }

全部代码在下载中,供参考

该文章主要介绍一种栈的使用思路,并不完善,可以加入诸多验证规则或支持浮点等。

相关推荐

  1. leetCode算法—10. 正则表达式匹配

    2024-03-14 18:34:02       50 阅读
  2. 简单函数_简单算术表达式求值

    2024-03-14 18:34:02       19 阅读
  3. 基于栈的后缀算数表达式求值(头歌)

    2024-03-14 18:34:02       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 18:34:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 18:34:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 18:34:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 18:34:02       20 阅读

热门阅读

  1. C#(C Sharp)学习笔记_变量常量与作用域【十二】

    2024-03-14 18:34:02       18 阅读
  2. 常用的git命令

    2024-03-14 18:34:02       23 阅读
  3. vue2、vue3 request请求删除接口用formData传参记录

    2024-03-14 18:34:02       22 阅读
  4. Ubuntu系统安装MySQL主从模式集群(成功!)

    2024-03-14 18:34:02       19 阅读
  5. Linux--家目录stu

    2024-03-14 18:34:02       23 阅读
  6. 访问者模式在量化交易系统开发的应用

    2024-03-14 18:34:02       21 阅读
  7. Linux移动文件夹和文件指令

    2024-03-14 18:34:02       21 阅读
  8. Linux异步通知实验:应用程序对异步通知的处理

    2024-03-14 18:34:02       25 阅读
  9. 快速配置ssh免密登录

    2024-03-14 18:34:02       23 阅读
  10. BIO、NIO、AIO有什么区别?

    2024-03-14 18:34:02       17 阅读
  11. 将LibMTL应用于自定义模型

    2024-03-14 18:34:02       20 阅读
  12. Spring篇面试题 2024

    2024-03-14 18:34:02       16 阅读
  13. 2. git 分支使用流程

    2024-03-14 18:34:02       21 阅读
  14. Linux Centos7 服务器局域网集群使用 NTP 同步时间

    2024-03-14 18:34:02       16 阅读
  15. 每日学习总结20240313

    2024-03-14 18:34:02       21 阅读