21xrx.com
2024-11-05 21:56:45 Tuesday
登录
文章检索 我的文章 写文章
C++ 前缀表达式转化为中缀表达式
2023-07-11 06:51:56 深夜i     --     --
C++ 前缀表达式 中缀表达式 转化 栈数据结构

前缀表达式和中缀表达式都是用于表示一些数学运算的表达式。前缀表达式的特点是运算符位于操作数之前,而中缀表达式的特点是运算符位于操作数之间。在C++代码中,我们可以将前缀表达式转化为中缀表达式。下面是具体步骤和示例代码。

1. 建立一个操作数栈和运算符栈。

2. 从右往左遍历前缀表达式的每一个字符(遍历时从后往前,因为前缀表达式是从右往左读取的)。如果遇到的是一个操作数,将该操作数压入操作数栈中。如果遇到的是一个运算符,将该运算符压入运算符栈中。

3. 如果遇到的是一个右括号,将该右括号压入运算符栈中。如果遇到的是一个左括号,从运算符栈中依次取出栈顶的操作符并弹出,直到遇到一个右括号。

4. 如果从运算符栈中得到的是一个非括号的运算符,弹出两个操作数栈中的操作数,并用该运算符将这两个操作数连接起来以形成一个新的表达式。然后将新的表达式作为一个操作数压入操作数栈中。

5. 最后,从操作数栈中弹出的元素就是转化后的中缀表达式。

下面是一个简单的示例代码,它将前缀表达式“+ * 2 3 4”转化为了中缀表达式“2 * 3 + 4”。在这个示例中,我们首先将操作数“2”、“3”和“4”分别压入操作数栈中。然后,我们依次将运算符“*”和“+”压入运算符栈中。接下来,我们弹出运算符栈中的“+”和操作数栈中的“4”和“* 2 3”的新表达式,然后将它们连接起来得到中缀表达式“2 * 3 + 4”。


#include <iostream>

#include <stack>

#include <string>

using namespace std;

int main()

{

  string prefix = "+ * 2 3 4"; //前缀表达式

  stack<string> operands; //操作数栈

  stack<char> operators; //运算符栈

  for(int i = prefix.length() - 1; i >= 0; i--) //从右往左遍历前缀表达式

  {

    char c = prefix[i];

    if(isdigit(c)) //如果是数字,将该操作数压入操作数栈中

    {

      operands.push(string(1, c));

    }

    else if(c == ')' || c == '*' || c == '/') //如果是右括号、乘号或除号,将该运算符压入运算符栈中

    {

      operators.push(c);

    }

    else if(c == '+' || c == '-') //如果是加号或减号

    {

      while(!operators.empty() && (operators.top() == '*' || operators.top() == '/')) //从运算符栈中依次取出栈顶的操作符并弹出,直到遇到一个加号或减号

      {

        string op2 = operands.top();

        operands.pop();

        string op1 = operands.top();

        operands.pop();

        char op = operators.top();

        operators.pop();

        operands.push("(" + op1 + op + op2 + ")"); //用该运算符将两个操作数连接起来以形成一个新的表达式,然后将新的表达式作为一个操作数压入操作数栈中

      }

      operators.push(c); //将该加号或减号压入运算符栈中

    }

    else if(c == '(') //如果是左括号,从运算符栈中依次取出栈顶的操作符并弹出,直到遇到一个右括号

    {

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

      {

        string op2 = operands.top();

        operands.pop();

        string op1 = operands.top();

        operands.pop();

        char op = operators.top();

        operators.pop();

        operands.push("(" + op1 + op + op2 + ")"); //用该运算符将两个操作数连接起来以形成一个新的表达式,然后将新的表达式作为一个操作数压入操作数栈中

      }

      operators.pop(); //弹出右括号

    }

  }

  while(!operators.empty()) //将剩余的操作符依次从运算符栈中取出并进行操作

  {

    string op2 = operands.top();

    operands.pop();

    string op1 = operands.top();

    operands.pop();

    char op = operators.top();

    operators.pop();

    operands.push("(" + op1 + op + op2 + ")"); //用该运算符将两个操作数连接起来以形成一个新的表达式,然后将新的表达式作为一个操作数压入操作数栈中

  }

  cout << operands.top() << endl; //从操作数栈中弹出的元素就是转化后的中缀表达式

  return 0;

}

  
  

评论区

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