算数表达式

简单计算器实现

输入一组仅包含“+、-、×”在内的算术表达式,比如“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;
        }
    }

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

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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
堆栈可以用来实现算数表达式的计算。 具体实现步骤如下: 1. 创建一个操作数栈和一个操作符栈。 2. 从左到右遍历表达式,对于每个字符: - 如果它是一个数字,则将其压入操作数栈。 - 如果它是一个操作符,则将其压入操作符栈。 - 如果它是一个右括号,则弹出操作符栈中的操作符和操作数栈中的操作数,直到遇到左括号为止。然后将计算结果压入操作数栈。 3. 最后,操作符栈中可能还有操作符,需要按照优先级顺序弹出操作符并计算,直到操作符栈为空。最后的操作数栈中的元素即为表达式的计算结果。 下面是一个示例代码,实现了一个简单的算数表达式计算器: ```python class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def is_empty(self): return len(self.items) == 0 def calculate(expression): precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0, ')': 0} operand_stack = Stack() operator_stack = Stack() for token in expression: if token.isdigit(): operand_stack.push(int(token)) elif token in '+-*/': while not operator_stack.is_empty() and precedence[token] <= precedence[operator_stack.peek()]: operator = operator_stack.pop() operand2 = operand_stack.pop() operand1 = operand_stack.pop() result = eval(f'{operand1} {operator} {operand2}') operand_stack.push(result) operator_stack.push(token) elif token == '(': operator_stack.push(token) elif token == ')': while operator_stack.peek() != '(': operator = operator_stack.pop() operand2 = operand_stack.pop() operand1 = operand_stack.pop() result = eval(f'{operand1} {operator} {operand2}') operand_stack.push(result) operator_stack.pop() while not operator_stack.is_empty(): operator = operator_stack.pop() operand2 = operand_stack.pop() operand1 = operand_stack.pop() result = eval(f'{operand1} {operator} {operand2}') operand_stack.push(result) return operand_stack.pop() expression = '2 * (3 + 4) - 5 / 2' result = calculate(expression) print(f'{expression} = {result}') ``` 输出结果为: ``` 2 * (3 + 4) - 5 / 2 = 13.5 ``` 注意,这个实现只支持整数和四则运算,没有处理错误输入和除数为0的情况。在实际应用中,需要加入更多的判断和处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲墨知秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值