中缀式 前缀式 后缀式 转换

算术表达式的转换

Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
   因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
Input
 输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
Output
 输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
+*ab*-c/def
a*b+c-d/e*f
ab*cde/-f*+
Hint
#include<iostream>
#include<string.h>
using namespace std;
char b[100010], s[100010] , print[100010];
int swi(char c)//前缀式优先级
{
    if(c=='+'||c=='-') return 1;
    if(c=='*'||c=='/') return 2;
    if(c==')')  return 3;
    if(c=='(') return 4;
    return 0;
}
int swa(char c)//后缀式优先级
{
    if(c=='+'||c=='-') return 1;
    if(c=='*'||c=='/') return 2;
    if(c=='(') return 3;
    if(c==')') return 4;
    return 0;
}
void display(int k)
{
    for(int i = k;i>0;i--)
     cout << print[i];
     cout << endl;
}

//逆序读取数组,存入输出数组,再逆序输出
void qian(int n)
{
    memset(s,0,sizeof(s[0]));
    memset(print,0,sizeof(print[0]));
    char c;
    int i ,k = 0, top = 0;
    for(i = n;i>0;i--)//逆读取
     {
         c = b[i];
         if(c>='a' && c<='z')
            print[++k] = c;
         else if(c != '(')
         {
             if(c == ')')
                s[++top] = c;
             else
             {
                 while(top!=0&&s[top]!=')'&& swi(s[top]) > swi(c))
                 {
                     print[++k] = s[top];
                     top--;
                 }
                 s[++top] = c;
             }
         }
         else
         {
             while(s[top]!= ')')
             {
                 print[++k] = s[top];
                 top--;
             }
             top--;
         }
     }
     if(top!=0)
     {
        while(top)
        print[++k] = s[top--];
     }
     display(k);
}
void hou(int n)
{
    char c;
    int top = 0;
    memset(s,0,sizeof(s[0]));
    for(int i = 1;i<=n;i++)
    {
        c = b[i];
        if(c>='a' && c<='z')
         cout << c;
          else
          {
              if(top==0)
              s[++top] = c;
              else if(swa(c) <= swa(s[top]))
              {
                  if(s[top] == '(')
                        s[++top] = c;
                  else
                  {
                      cout << s[top];
                      s[top] = c;
                  }
              }
              else
              {
                  if(c==')')
                  {
                      while(s[top]!='(')
                      {
                          cout << s[top];
                          top--;
                      }
                      top--;
                  }
                  else s[++top] = c;
              }
          }
    }
    if(top!=0)
    {
        while(top!=0)
            cout << s[top--];
    }
    cout << endl;
}
int main()
{
    char c;
    int n = 0;
    while(cin >> c &&c!='#')
     b[++n] = c;//存入数组中
     qian(n);

     for(int i = 1;i<=n;i++)
     {
         if(b[i]!='('&&b[i]!=')')
            cout << b[i];
     }
     cout << endl;

     hou(n);

    return 0;
}




为了回答你的问题,我将介绍前缀中缀后缀表达,并展示如何在它们之间进行转换。 1. 前缀表达(也称为波兰): 在前缀表达中,运算符位于操作数之前。例如,表达 "2 + 3" 的前缀为 "+ 2 3"。 2. 中缀表达中缀表达是我们通常使用的常规数学表达。它使用括号和运算符的优先级来表示运算顺序。例如,表达 "2 + 3" 就是一个中缀表达。 3. 后缀表达(也称为逆波兰): 在后缀表达中,运算符位于相应的操作数之后。例如,表达 "2 + 3" 的后缀为 "2 3 +"。 现在,我将向你展示如何将中缀表达转换前缀后缀表达。 从中缀前缀转换: 1. 反转中缀表达。 2. 将反转的中缀表达转换后缀。 3. 反转后缀表达即可得到前缀表达。 从中缀后缀转换: 1. 创建一个空栈和一个空输出列表。 2. 从左到右扫描中缀表达的每个符号。 - 如果遇到操作数,将其添加到输出列表。 - 如果遇到运算符,将其压入栈中。 - 如果遇到左括号,将其压入栈中。 - 如果遇到右括号,则连续弹出栈顶元素并将其添加到输出列表,直到遇到左括号为止。注意:左括号不会被添加到输出列表中。 如果栈顶元素是左括号,则将其弹出栈。 - 如果遇到的运算符具有比栈顶运算符更高的优先级,将其压入栈中。 如果遇到的运算符具有与栈顶运算符相同的优先级,并且是左结合的运算符,则将栈顶运算符弹出并添加到输出列表中,然后将当前运算符压入栈中。 如果遇到的运算符具有与栈顶运算符相同的优先级,并且是右结合的运算符,则将当前运算符压入栈中。 - 重复步骤2直到扫描完整个中缀表达。 3. 将栈中剩余的所有运算符弹出并添加到输出列表中。 4. 输出列表即为转换后的后缀表达。 希望这个解释对你有帮助!如果你有其他问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值