中缀式 前缀式 后缀式 转换

算术表达式的转换

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值