数据结构与算法实验:实验二 链表实现一元多项式的加法/减法/乘法/求导

表达式求值是进行数据处理的最基本操作。请编写程序完成一个简单算术表达式的求值。要求如下:

(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
*/

猜你喜欢

转载自blog.csdn.net/Spidy_harker/article/details/105171162