表达式求值是进行数据处理的最基本操作。请编写程序完成一个简单算术表达式的求值。要求如下:
(1) 运算符包括:+、-、*、-、^(乘方)、括号
(2)运算量为数值常量,根据自己的能力可以对运算量做不同的约束,例如1位整数、多位整数、实数等(会有不同的测试用例);
输入:一行,即表达式,以“=”结束。例如:
5*(8-3)+6/5=
输出:一行,即表达式的值。结果值为整数时输出为整数,如果有小数时保留5位小数。
26.20000
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int *create(int x,int y)
{
int *a;
a=new int[2];
a[0]=x,a[1]=y;
return a;
}
template<class T>
struct node
{
T x;
node<T>* nex,*pre;
node()
{
nex=NULL;
pre=NULL;
}
node(T a)
{
x=a;
pre=nex=NULL;
}
};
template<class T>
class Link
{
public:
node<T> *e,*head,*last;
int siz;
Link();
Link(const Link& L);
~Link();
void push_back(T val);
void build();
void Insert(int pos,T x);
void del(T x);
int Search(int x);
void print();
void Sort();
void deleteAll();
};
template <class T>
Link<T>::Link()
{
head = new node<T>;
last = new node<T>;
head->nex = last;
head->pre = NULL;
last->nex = NULL;
last->pre = head;
siz = 0;
}
template <class T>
Link<T>::Link(const Link &L)
{
head = new node<T>;
head->pre = NULL;
last = new node<T>;
head->nex = last;
last->pre = head;
siz = 0;
e = L.head;
while(e->nex != L.last)
{
e = e->nex;
last->x = e->x;
node<T> *p = new node<T>;
p->pre = last;
last->nex = p;
last = p;
siz++;
}
last->nex = NULL;
}
template <class T>
Link<T>::~Link()
{
if(siz == 0)
{
delete head;
delete last;
head = NULL;
last = NULL;
return;
}
while(head->nex != NULL)
{
node<T> *temp = head;
head = head->nex;
delete temp;
}
delete head;
head = NULL;
}
template <class T>
void Link<T>::push_back(T val)
{
last->x = val;
last->nex = new node<T>;
node<T> *p = last;
last = last->nex;
last->pre = p;
last->nex = NULL;
siz++;
return;
}
template <class T>
void Link<T>::build()
{
int x,y;
while(cin>>x&&x!=0)
{
cin>>y;
int *a=create(x,y);
this->push_back(a);
}
}
template <class T>
void Link<T>::del(T x)
{
if(siz == 0) return ;
node<T> *p = head;
while(p->nex!=last)
{
p = p->nex;
if(p->x == x)
{
node<T> *temp = p->pre;
temp->nex = p->nex;
p->nex->pre = temp;
delete p;
siz--;
return ;
}
}
}
template <class T>
int Link<T>::Search(int x)
{
node<T>* p=head->nex;
while(p!=last)
{
if(p->x[1]==x)
return p->x[0];
p=p->nex;
}
return -1;
}
template <class T>
void Link<T>::print()
{
if(siz==0) cout<<endl;
node<T>* p=head->nex;
int cnt=1;
cout<<"C(x)=";
while(p!=last)
{
int d=p->x[0],m=p->x[1];
if(m==0)
{
cout<<d;
cnt++;
p=p->nex;
continue;
}
if(cnt!=1)
{
if(d>0) cout<<'+';
}
if(d!=1) cout<<d;
cout<<'x';
if(m!=1)cout<<'^'<<m;
p=p->nex;
cnt++;
}
cout<<endl;
}
template <typename T>
void Link<T>::Sort()
{
if(siz <= 1) return;
node<T> *p = head->nex;
for (int i = 0; i < siz-1; i++)
{
node<T> *q = p->nex;
for (int j = i+1; j < siz; j++)
{
if(p->x[1] > q->x[1])
{
T temp = q->x;
q->x = p->x;
p->x = temp;
}
q=q->nex;
}
p = p->nex;
}
}
template <typename T>
void Link<T>::deleteAll()
{
if(siz == 0)
{
return ;
}
node<T> *p = head->nex;
while(p != last)
{
node<T>* temp = p;
p = p->nex;
delete temp;
}
head->nex = last;
last->pre = head;
siz = 0;
}
template<class T>
Link<T> Add(Link<T>a,Link<T>b,int i)
{
if(a.siz==0) return b;
if(b.siz==0) return a;
Link<T> c;
node<T>* p=a.head->nex;
int *n;///存a*x^b的a,b
bool visit[b.siz+5];
memset(visit,0,sizeof(visit));
while(p!=a.last)
{
int d=b.Search(p->x[1]);
if(d==-1)
{
n=create(p->x[0],p->x[1]);
c.push_back(n);
}
else
{
int sum=p->x[0]+d*i;
if(sum!=0)
{
n=create(sum,p->x[1]);
c.push_back(n);
}
visit[p->x[1]]=true;
}
p=p->nex;
}
node<T>* q=b.head->nex;
while(q!=b.last)
{
if(!visit[q->x[1]])
{
n=create(i*(q->x[0]),q->x[1]);
c.push_back(n);
}
q=q->nex;
}
c.Sort();
return c;
}
template<class T>
Link<T> Mul(Link<T>a,Link<T>b)
{
Link<T> result;
int a1[2][a.siz+5],a2[2][b.siz+5];
int res[2][a.siz+b.siz+5];
int cnt1=0,cnt2=0,cnt3=0;
node<T>* p=a.head->nex,*q=b.head->nex;
while(p!=a.last)
{
a1[0][cnt1]=p->x[0],a1[1][cnt1++]=p->x[1];
p=p->nex;
}
while(q!=b.last)
{
a2[0][cnt2]=q->x[0],a2[1][cnt2++]=q->x[1];
q=q->nex;
}
for(int i=0;i<cnt1;i++)
{
int x1=a1[0][i],y1=a1[1][i];
for(int j=0;j<cnt2;j++)
{
int x2=a2[0][j],y2=a2[1][j];
int flag=0;
for(int k=0;k<cnt3;k++)
{
if(res[1][k]==y1+y2)
{
res[0][k]+=x1*x2;
flag=1;
}
}
if(!flag)res[0][cnt3]=x1*x2,res[1][cnt3++]=y1+y2;
}
}
for(int i=0;i<cnt3;i++)
{
int *n;
n=create(res[0][i],res[1][i]);
result.push_back(n);
}
result.Sort();
return result;
}
template<class T>
Link<T> Dee(Link<T>a)
{
Link<T> result;
node<T>* p=a.head->nex;
int *n;
while(p!=a.last)
{
int x=p->x[0],y=p->x[1];
if(y==0)
{
p=p->nex;
continue;
}
n=create(x*y,y-1);
result.push_back(n);
p=p->nex;
}
result.Sort();
return result;
}
int main()
{
char c;
Link<int*> l1,l2;
while(cin>>c)
{
if(c=='C')
{
l1.build();
l2.build();
}
if(c=='S')
{
Link<int*> l3=Add(l1,l2,-1);
l3.print();
}
if(c=='P')
{
Link<int*> l3=Add(l1,l2,1);
l3.print();
}
if(c=='M')
{
Link<int*> l3=Mul(l1,l2);
l3.print();
}
if(c=='D')
{
Link<int*> l3=Dee(l1);
l3.print();
}
if(c=='V')
{
double x;
cin>>x;
node<int*>* p=l1.head->nex;
double res=0;
while(p!=l1.last)
{
int a=p->x[0],b=p->x[1];
double sum=1;
for(int i=1;i<=b;i++) sum*=x;
res+=sum*a;
p=p->nex;
}
printf("%.2lf\n",res);
}
if(c=='X')
{
return 0;
}
}
return 0;
}
/*
C
1 2 3 4 5 6 9 10 7 8 0
2 3 4 5 6 7 0
*/