21xrx.com
2024-11-22 08:02:32 Friday
登录
文章检索 我的文章 写文章
C++ 栈实现四则运算
2023-07-05 07:11:06 深夜i     --     --
C++ 实现 四则运算

C++是一种非常流行的计算机编程语言,它支持许多数据结构和算法。其中,栈是一种常用的数据结构,常被用于实现表达式求值、函数调用等操作。本文将介绍如何使用C++栈实现四则运算。

四则运算是数学中最基本的运算之一,包括加法、减法、乘法和除法。我们可以将一个包含四则运算的表达式表示为一个字符串,并按照约定的优先级进行计算。

以“3+4×2÷(1-5)”的表达式为例,首先需要将其转换为逆波兰表达式。逆波兰表达式是一种将运算符写在操作数之后的表示方法,可以通过栈实现计算。

首先,我们需要定义一个栈来存储运算符。遍历表达式字符串,依次处理每个字符。如果该字符是数字,将其压入栈中;如果是运算符,判断其与栈顶运算符之间的优先级,如果该运算符优先级小于等于栈顶运算符,则将栈顶运算符弹出,并将弹出的运算符添加到逆波兰表达式中,直到栈顶运算符优先级小于该运算符或者栈为空。最后,将该运算符压入栈中。

完成对表达式的遍历之后,将栈中所有运算符依次弹出并加入到逆波兰表达式中即可得到最终的结果。对逆波兰表达式进行计算,可以使用一个栈来实现。遍历逆波兰表达式,如果该元素是数字,则将其压入栈中;如果是运算符,弹出栈顶两个数,进行运算,并将运算结果压入栈中。最后,栈中剩余的数即为最终结果。

实现四则运算的C++代码如下:


#include<iostream>

#include<stack>

#include<string>

using namespace std;

int priority(char c)

{

  if (c == '+' || c == '-')

    return 1;

  if (c == '*' || c == '/')

    return 2;

  return 0;

}

int calculate(int a, int b, char op)

{

  if (op == '+')

    return a + b;

  if (op == '-')

    return a - b;

  if (op == '*')

    return a * b;

  if (op == '/')

    return a / b;

  return 0;

}

int eval(string s)

{

  stack<int> vals;

  stack<char> ops;

  for (int i = 0; i < s.length(); i++)

  {

    if (s[i] >= '0' && s[i] <= '9')

    {

      int val = 0;

      while (i < s.length() && s[i] >= '0' && s[i] <= '9')

      {

        val = val * 10 + (s[i] - '0');

        i++;

      }

      i--;

      vals.push(val);

    }

    else if (s[i] == '(')

    {

      ops.push(s[i]);

    }

    else if (s[i] == ')')

    {

      while (ops.top() != '(')

      {

        int b = vals.top();

        vals.pop();

        int a = vals.top();

        vals.pop();

        char op = ops.top();

        ops.pop();

        vals.push(calculate(a, b, op));

      }

      ops.pop();

    }

    else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')

    {

      while (!ops.empty() && ops.top() != '(' && priority(s[i]) <= priority(ops.top()))

      {

        int b = vals.top();

        vals.pop();

        int a = vals.top();

        vals.pop();

        char op = ops.top();

        ops.pop();

        vals.push(calculate(a, b, op));

      }

      ops.push(s[i]);

    }

  }

  while (!ops.empty())

  {

    int b = vals.top();

    vals.pop();

    int a = vals.top();

    vals.pop();

    char op = ops.top();

    ops.pop();

    vals.push(calculate(a, b, op));

  }

  return vals.top();

}

int main()

{

  string exp = "3+4*2/(1-5)";

  cout << eval(exp) << endl;

  return 0;

}

上述代码中,我们定义了两个栈,vals用于存储操作数,ops用于存储运算符。遍历表达式字符串,依次处理每个字符。如果该字符是数字,则找到连续的数字并将其转换为整数压入vals栈中;如果是左括号,直接将其压入ops栈中;如果是右括号,则不断弹出ops栈顶元素,在碰到左括号之前将所有弹出元素进行计算并将结果压入vals栈中;如果是运算符,则不断弹出ops栈顶元素,直至ops栈顶元素的优先级小于等于该运算符的优先级,将所弹出的运算符和vals栈顶两个元素进行计算并将结果压入vals栈中,最后将该运算符压入ops栈中。最后,当表达式遍历完毕后,需要将ops中剩余的运算符和vals中剩余的操作数进行计算并将结果返回。

以上就是使用C++栈实现四则运算的方法,使用这种方法可以让代码清晰易懂、简洁高效,并且可以应用于其他类似的计算问题中。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复