首页 > 其他分享 >P1175 表达式的转换

P1175 表达式的转换

时间:2022-12-13 11:24:37浏览次数:66  
标签:kdl 转换 int char P1175 return 表达式

P1175 表达式的转换

题目简述

给定常规的表达式,将其改写为后缀表达式并把每个中间过程进行的运算结果依次输出


思路

思维难度不大,毕竟数据量比较小,暴力就行了,但码量还是有一点的,代码有点丑,日后有机会可以尝试重新写一遍


代码

#include<bits/stdc++.h>
using namespace std;
const int N=105;
char s[N];
int len,md[N],kdl;
char _s[N][N];
int cal(int sta){
  int kdl=0;
  for(int i=sta;i;i++){
    if(s[i]=='(')kdl++;
    if(s[i]==')')kdl--;
    if(kdl==0)return i; 
  }
}
void work(int l,int r){
  if(l>r)return ;
  switch(s[l]){
    case '+':{
      for(int i=l+1;i<=r;){
        if(s[i]=='+'||s[i]=='-'){
          work(l+1,i-1);
          _s[1][++len]='+';
          work(i,r);
          return ;
        }
        else {
          if(s[i]=='(')i=cal(i)+1;
          else i++;
        }
      }
      work(l+1,r);
      _s[1][++len]='+';
      return ;
    }
    case '-':{
      for(int i=l+1;i<=r;){
        if(s[i]=='+'||s[i]=='-'){
          work(l+1,i-1);
          _s[1][++len]='-';
          work(i,r);
          return ;
        }
        else {
          if(s[i]=='(')i=cal(i)+1;
          else i++;
        }
      }
      work(l+1,r);
      _s[1][++len]='-';
      return ;
    }
    case '/':{
      for(int i=l+1;i<=r;){
        if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
          work(l+1,i-1);
          _s[1][++len]='/';
          work(i,r);
          return ;
        }
        else {
          if(s[i]=='(')i=cal(i)+1;
          else i++;
        }
      }
      work(l+1,r);
      _s[1][++len]='/';
      return ;
    }
    case '*':{
      for(int i=l+1;i<=r;){
        if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
          work(l+1,i-1);
          _s[1][++len]='*';
          work(i,r);
          return ;
        }
        else {
          if(s[i]=='(')i=cal(i)+1;
          else i++;
        }
      }
      work(l+1,r);
      _s[1][++len]='*';
      return ;
    }
    case '^':{
      for(int i=l+1;i<=r;){
        if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
          work(l+1,i-1);
          _s[1][++len]='^';
          work(i,r);
          return ;
        }
        else {
          if(s[i]=='(')i=cal(i)+1;
          else i++;
        }
      }
      work(l+1,r);
      _s[1][++len]='^';
      return ;
    }
    case '(':{
      work(l+1,cal(l)-1);
      work(cal(l)+1,r);
      return ;
    }
  }
  _s[1][++len]=s[l];
  work(l+1,r);
  return ;
}
int main(){
  scanf("%s",s+1);
  work(1,strlen(s+1));
  for(int i=1;i<=len;i++)cout<<_s[1][i]<<' ';
  puts("");
  for(int i=1;i<=len;i++){
    if(_s[1][i]>='0'&&_s[1][i]<='9'){
      md[++kdl]=_s[1][i]-'0';
      continue;
    }
    switch(_s[1][i]){
      case '+':{
        md[kdl-1]=(md[kdl-1])+(md[kdl]);
        kdl--;
        for(int j=1;j<=kdl;j++)cout<<md[j]<<' ';
        for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' ';
        cout<<endl;
        break;
      }
      case '-':{
        md[kdl-1]=(md[kdl-1])-(md[kdl]);
        kdl--;
        for(int j=1;j<=kdl;j++)cout<<md[j]<<' ';
        for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' ';
        cout<<endl;
        break;
      }
      case '*':{
        md[kdl-1]=(md[kdl-1])*(md[kdl]);
        kdl--;
        for(int j=1;j<=kdl;j++)cout<<md[j]<<' ';
        for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' ';
        cout<<endl;
        break;
      }
      case '/':{
        md[kdl-1]=(md[kdl-1])/(md[kdl]);
        kdl--;
        for(int j=1;j<=kdl;j++)cout<<md[j]<<' ';
        for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' ';
        cout<<endl;
        break;
      }
      case '^':{
        md[kdl-1]=pow((md[kdl-1]),(md[kdl]));
        kdl--;
        for(int j=1;j<=kdl;j++)cout<<md[j]<<' ';
        for(int j=i+1;j<=len;j++)cout<<_s[1][j]<<' ';
        cout<<endl;
        break;
      }
    }
  }
  return 0;
}

标签:kdl,转换,int,char,P1175,return,表达式
From: https://www.cnblogs.com/fleabag/p/16978068.html

相关文章