龙空技术网

C# 使用栈解析加减乘除数学计算式的简单例子

凡人兔子张 113

前言:

现时同学们对“栈的运算操作规则”大概比较注重,大家都想要了解一些“栈的运算操作规则”的相关知识。那么小编在网络上收集了一些有关“栈的运算操作规则””的相关文章,希望同学们能喜欢,姐妹们快快来学习一下吧!

要使用栈解析加减乘除的数学计算式,您可以使用以下步骤:

创建两个栈,一个用于存储操作数(数字),另一个用于存储操作符(加减乘除)。遍历数学计算式中的每个字符。如果遇到数字,将其转换为整数并将其推入操作数栈中。如果遇到操作符,检查操作符栈的栈顶元素:如果操作符栈为空,或者栈顶元素为左括号"(",将当前操作符推入操作符栈中。如果当前操作符的优先级大于栈顶操作符的优先级,将当前操作符推入操作符栈中。否则,从操作数栈中弹出两个操作数,从操作符栈中弹出一个操作符,进行相应的计算,并将结果推入操作数栈中,然后将当前操作符推入操作符栈中。如果遇到左括号"(",将其推入操作符栈中。如果遇到右括号")",从操作数栈中弹出两个操作数,从操作符栈中弹出一个操作符,进行相应的计算,并将结果推入操作数栈中,直到遇到左括号"("为止。遍历完整个数学计算式后,从操作数栈中弹出最终的计算结果。

以下是一个示例代码,演示如何使用栈解析加减乘除的数学计算式:

using System;using System.Collections.Generic;class Program{    static void Main()    {        string expression = "3 + 4 * 2 - 6 / 3";        int result = EvaluateExpression(expression);        Console.WriteLine("计算结果: " + result);    }    static int EvaluateExpression(string expression)    {        Stack<int> operandStack = new Stack<int>();        Stack<char> operatorStack = new Stack<char>();        for (int i = 0; i < expression.Length; i++)        {            char ch = expression[i];            if (ch == ' ')            {                continue;            }            else if (Char.IsDigit(ch))            {                int operand = 0;                while (i < expression.Length && Char.IsDigit(expression[i]))                {                    operand = operand * 10 + (expression[i] - '0');                    i++;                }                i--;                operandStack.Push(operand);            }            else if (ch == '(')            {                operatorStack.Push(ch);            }            else if (ch == ')')            {                while (operatorStack.Peek() != '(')                {                    int result = PerformOperation(operatorStack.Pop(), operandStack.Pop(), operandStack.Pop());                    operandStack.Push(result);                }                operatorStack.Pop(); // 弹出左括号            }            else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')            {                while (operatorStack.Count > 0 && HasPrecedence(ch, operatorStack.Peek()))                {                    int result = PerformOperation(operatorStack.Pop(), operandStack.Pop(), operandStack.Pop());                    operandStack.Push(result);                }                operatorStack.Push(ch);            }        }        while (operatorStack.Count > 0)        {            int result = PerformOperation(operatorStack.Pop(), operandStack.Pop(), operandStack.Pop());            operandStack.Push(result);        }        return operandStack.Pop();    }    static bool HasPrecedence(char op1, char op2)    {        if (op2 == '(' || op2 == ')')        {            return false;        }        if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-'))        {            return false;        }        return true;    }    static int PerformOperation(char op, int b, int a)    {        switch (op)        {            case '+':                return a + b;            case '-':                return a - b;            case '*':                return a * b;            case '/':                return a / b;            default:                throw new ArgumentException("无效的操作符: " + op);        }    }}

在这个示例中,我们使用两个栈:operandStack用于存储操作数,operatorStack用于存储操作符。

我们遍历数学计算式中的每个字符,并根据字符的类型执行相应的操作。

最后,我们从operandStack中弹出最终的计算结果并返回。

请注意,这只是一个简单的示例,可能不适用于所有情况。

在实际应用中,您可能需要考虑更复杂的数学表达式语法和错误处理。

标签: #栈的运算操作规则