表达式求值

闲着也是闲着继续更新下

表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+ 11 / * 22 – 7 4 3)。后缀表达式和前缀表达式中没有括号,给计算带来方便。如后缀式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。
基本要求
 从文件或键盘读入中缀表达式。
 设计操作数为多位整数,操作符为加、减、乘、除、求模的中缀表达式求值算法。
 设计将中缀表达式转换为后缀表达式的算法。
 设计将中缀表达式转换为前缀表达式的算法。
 设计后缀表达式求值算法。
 设计前缀表达式求值算法。
 输出各种形式的表达式。

MD这就有点难度了
主要是刚刚学了一些类还处于一脸懵逼的状态中
不过马马虎虎的呃
写了下
代码如下
类的设计

#ifndef CLASS_H_
#define CLASS_H_
#include<iostream>
#include<cctype>

template<typename t>
class Stck
{
private:
    enum{MAX=20};
    t items[MAX];
    int top;
public:
    Stck();
    bool push(const t &item);
    bool pop();
    bool pop1(t &item);
    char gettop();
    double operat(const char s);
    double operat1(const char s);
    void show(int n);
    void showall();
    void showlla();

};
int Judge(char c1,char c2);
int Judge1(char c1,char c2);
int Judge2(char c1,char c2);

template<typename t>
Stck<t>::Stck()
{
    top=0;
}


template<typename t>
bool Stck<t>::push(const t&item)
{
    if(top<MAX)
    {
        items[top]=item;
        top++;
        return true;
    }
    else
        return false;
}

template<typename t>
bool Stck<t>::pop()
{
    if(top>0)
    {
        top--;
        return true;
    }
    else return false;
}
template<typename t>
bool Stck<t>::pop1(t &item)
{
    if(top>0)
    {
        item=items[top-1];
        top--;
        return true;
    }
    return false;
}

template<typename t>
char Stck<t>::gettop()
{
    return items[top-1];
}
template<typename t>
double Stck<t>::operat(const char s)
{
    if(s=='+')
        return items[top-1]+items[top-2];
    if(s=='-')
        return items[top-2]-items[top-1];
    if(s=='*')
        return items[top-1]*items[top-2];
    if(s=='/')
        return items[top-2]/items[top-1];

}
template<typename t>
double Stck<t>::operat1(const char s)
{
    if(s=='+')
        return items[top-1]+items[top-2];
    if(s=='-')
        return items[top-1]-items[top-2];
    if(s=='*')
        return items[top-1]*items[top-2];
    if(s=='/')
        return items[top-1]/items[top-2];

}
template<typename t>
void Stck<t>::show(int n)
{
    std::cout<<items[n];
}
template<typename t>
void Stck<t>::showall()
{
    for(int i=top-1;i;i--)
    {
        if(items[i]!='#')
        std::cout<<items[i]<<" ";

    }
}
template<typename t>
void Stck<t>::showlla()
{
    for(int i=0;i<top;i++)
    {
        if(items[i]!='#')
        {
           if(isdigit(items[i]))
           {int nn=(int)(items[i]-48);
            std::cout<<nn<<" ";

           }
           std::cout<<items[i]<<" ";
        }


    }
}


int Judge(char c1,char c2)
{
    int a1,a2;
    if('+'==c1||'-'==c1)
        a1 = 3;
    if('*'==c1||'/'==c1)
        a1 = 5;
    if('('==c1)
        a1 = 1;
    if(')'==c1)
        a1 = 7;
    if('#'==c1)
        a1 = 0;

    if('+'==c2||'-'==c2)
        a2 = 2;
    if('*'==c2||'/'==c2)
        a2 = 4;
    if('('==c2)
        a2 = 6;
    if(')'==c2)
        a2 = 1;
    if('#'==c2)
        a2 = 0;
    if(a1>a2) return 1;
    if(a1==a2) return 0;
    if(a1<a2) return -1;
}
int Judge1(char c1,char c2)
{
    int a1,a2;
    if('+'==c1||'-'==c1)
        a1 = 3;
    if('*'==c1||'/'==c1)
        a1 = 5;
    if('('==c1)
        a1 = 1;
    if('#'==c1)
        a1 = 0;

    if('+'==c2||'-'==c2)
        a2 = 2;
    if('*'==c2||'/'==c2)
        a2 = 4;
    if(a1>a2) return 1;
    if(a1==a2) return 0;
    if(a1<a2) return -1;
}
int Judge2(char c1,char c2)
{
    int a1,a2;
    if('+'==c1||'-'==c1)
        a1 = 2;
    if('*'==c1||'/'==c1)
        a1 = 5;
    if(')'==c1)
        a1 = 1;
    if('#'==c1)
        a1 = 0;

    if('+'==c2||'-'==c2)
        a2 = 2;
    if('*'==c2||'/'==c2)
        a2 = 4;
    if(a1>a2) return 1;
    if(a1==a2) return -1;
    if(a1<a2) return -1;
}





#endif // CLASS_H_

就是这样蛮繁琐的呃

主函数

#include<iostream>
#include<string>
#include<cctype>
#include<sstream>
#include<math.h>
#include"class.h"
using namespace std;

void zhongzhui()
{
    int n=0,n1,i11,result=0;
    double cal;
    char oprtop,s;
    string l1;
    string l;
    stringstream ss,ss1;
    Stck<char> opr;
    Stck<int> num;
    int i=0,i1=0,aa=0;
    int nu[4]={0};
    cout<<"请输入中缀表达式\n";
    cin>>l;
    int cc=l.size();
    cin.get();
    cout<<"结果为\n";
    string lc="#";
    lc+=l;
    l.append(1,'#');
    opr.push('#');
    while(opr.gettop()!='#'||l[n]!='#')
{
    if(isdigit(l[n]))
      {

          i=0;
          aa=0;
         while(isdigit(l[n]))
         {

              ss<<l[n];
              ss>>nu[i];
              i++;
              n++;
              ss.clear();
         }
         i11=i;
         for(i1=0;i1<i11;i1++)
         {
             aa=pow(10,i1)*nu[i-1]+aa;
             i--;
         }
         num.push(aa);
      }
    else
       {
          oprtop=opr.gettop();
          result=Judge(oprtop,l[n]);
          switch(result)
         {
           case -1:opr.push(l[n]);n++;break;
           case 0:opr.pop();n++;break;
           case 1: cal=num.operat(oprtop);
               num.pop();num.pop();
               opr.pop();
               num.push(cal);break;

         }
       }


}
   num.show(0);
   cout<<"\n";



   cout<<"换为后缀表达式\n";
    Stck<char>s1;
    char item;
    s1.push('#');
    n=0;

    while(l[n]!='#')
{
    if(isdigit(l[n]))
    {

          i=0;
          aa=0;

         while(isdigit(l[n]))
         {

              ss<<l[n];
              ss>>nu[i];
              i++;
              n++;
              ss.clear();
         }
         i11=i;
         for(i1=0;i1<i11;i1++)
         {
             aa=pow(10,i1)*nu[i-1]+aa;
             i--;
         }
         cout<<aa<<" ";
     }
     else
     {
         if(l[n]=='(')
         {
             s1.push('(');
             n++;
         }
         else if(l[n]==')')
         {
             s1.pop1(item);
             while(item!='(')
             {
               cout<<item<<" ";
               s1.pop1(item);
             }
             n++;
         }
         else
         {
            oprtop=s1.gettop();
            result=Judge1(oprtop,l[n]);
            switch(result)
           {
             case -1:s1.push(l[n]);n++;break;
             case 1:s1.pop1(item);cout<<item<<" ";break;
           }
         }

     }

    }
s1.showall();
cout<<endl;

cout<<"转换为前缀表达式\n";
   Stck<char>s4;
   Stck<int>s3;
   string res,res1,res2,res4;
    char item11,oprtop11;
    s4.push('#');
    n=cc;

    while(lc[n]!='#')
{
    if(isdigit(lc[n]))
    {

          i=0;
          aa=0;

         while(isdigit(lc[n]))
         {

              ss<<lc[n];
              ss>>nu[i];
              i++;
              n--;
              ss.clear();
         }
         i11=i;
         for(i1=0;i1<i11;i1++)
         {
             aa=pow(10,i-1)*nu[i-1]+aa;
             i--;
         }
        ss1<<aa;
        ss1>>res1;
        ss1.clear();
         res+=res1;
         res.append(1,' ');
     }
     else
     {
         if(')'==lc[n])
         {
             s4.push(')');
             n--;
         }
         else if(lc[n]=='(')
         {
             s4.pop1(item11);
             while(item11!=')')
             {
               res2=item11;
               res2.append(1,' ');
               res+=res2;

               s4.pop1(item11);
             }
             n--;
         }
         else
         {
            oprtop11=s4.gettop();
            result=Judge2(oprtop11,lc[n]);
            switch(result)
           {
             case -1:s4.push(lc[n]);n--;break;
             case 1:s4.pop1(item11);res4=item11;res+=res4;res.append(1,' '); break;
           }
         }

     }

    }

s4.showlla();
int size1=res.size();
for(int i=size1-2;i+1;i--)
{
    cout<<res[i];
}

cout<<endl;

}

void houzhui()
{
    int n=0,n1,i11,result=0;
    double cal;
    char oprtop,s;
    string l1;
    string l;
    stringstream ss;
    Stck<char> opr;
    Stck<int> num;
    int i=0,i1=0,aa=0;
    int nu[4]={0};

  cout<<"请输入后缀表达式\n";


  getline(cin,l1);

  n=0;
  double result1;
  Stck<double> num1;
  l1.append(1,'#');
  while(l1[n]!='#')
  {
      if(isdigit(l1[n]))
      {

          i=0;
          aa=0;
         while(l1[n]!=' ')
         {

              ss<<l1[n];
              ss>>nu[i];
              i++;
              n++;
              ss.clear();
         }
         i11=i;
         for(i1=0;i1<i11;i1++)
         {
             aa=pow(10,i1)*nu[i-1]+aa;
             i--;
         }
         num1.push(aa);
     }
     else if(l1[n]==' ')
        n++;
     else
     {
         result1=num1.operat(l1[n]);
         num1.pop();
         num1.pop();
         num1.push(result1);
         n++;

     }




  }

cout<<"结果为  ";

num1.show(0);
cout<<endl;

}

void qianzhui()
{
         int n=0,n1,i11,result=0;
    double cal;
    char oprtop,s;
    string l1;
    string l;
    stringstream ss;
    Stck<char> opr;
    Stck<int> num;
    int i=0,i1=0,aa=0;
    int nu[4]={0};


  cout<<"请输入前缀表达式\n";
  getline(cin,l);
  n=l.size();
   l1="#";
    l1+=l;
    double result1;
  Stck<double> num1;

  while(l1[n]!='#')
  {
      if(isdigit(l1[n]))
      {

          i=0;
          aa=0;
         while(l1[n]!=' ')
         {

              ss<<l1[n];
              ss>>nu[i];
              i++;
              n--;
              ss.clear();
         }
         i11=i;
         for(i1=0;i1<i11;i1++)
         {
             aa=pow(10,i1)*nu[i-1]+aa;
             i--;
         }
         num1.push(aa);
     }
     else if(l1[n]==' ')
        n--;
     else
     {
         result1=num1.operat1(l1[n]);
         num1.pop();
         num1.pop();
         num1.push(result1);
         n--;

     }




  }

cout<<"结果为  ";

num1.show(0);
cout<<endl;

}
int main()
{

  zhongzhui();
  houzhui();
  qianzhui();
}

呃 新手毕竟
写了两三天吧
现学现卖
运行下吧

运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值