闲着也是闲着继续更新下
表达式是数据运算的基本形式。人们的书写习惯是中缀式,如: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();
}
呃 新手毕竟
写了两三天吧
现学现卖
运行下吧