回忆多项式解析运算思路

我觉得我编写这个多项式解析的过程中收获了很多,而且自己对成果也很满意,所以决定将过程与思路记录成博文。

首先是完整代码段的Github地址。

数据存储

typedef struct poly{
    int coe, ind;
    struct poly *next;
}Poly;

一元多项式无非只有系数和指数,所以定义结构体,其中coe存放系数,ind存放指数,并采用单链表链接各节点。

文本解析

文本解析方案当初找到了很多,最后决定采用正则表达式,一个是因为方便实用,一个是因为之前学习过正则表达式之后一直没实际使用过,正好借此机会熟悉熟悉。

regex pattern("(([+-]|^)\\d+[Xx]\\^\\d+)");

regex pa("([+-]|^)(\\d+)([+-]|$)");
string rep="$1$2x^0$3";

//regex patt("([+-]|^)(\\d+)([Xx])([+-]|$)");
//string replace="$1$2$3^1$4";
regex patt("([Xx])([+-]|$)");
string replace="$1^1$2";

regex patter("([+-]|^)([Xx])");
string re = "$1$101$2$3";

for (n = 0; n < 2; n++){
    cout << "请输入多项式:";
    cin >> in;

    in = regex_replace(in, patter, re);
    //格式化字符串:x
    in=regex_replace(in, patt, replace);

    in = regex_replace(in, pa, rep);
    //cout << in << endl;

     for (std::sregex_iterator it(in.cbegin(), in.cend(), pattern), q; it != q; ++it){
        //cout << "str: " << it->format("$1") << "\n";
        //cout << it->format("$1")[0];

        ss<<it->format("$1");
        if(it->format("$1")[0]=='+'||it->format("$1")[0] == '-') ss>>c;
        ss>>coe;
        if(c=='-') coe=-coe;
        ss>>c;ss>>c;
        ss>>ind;
        //cout<<coe<<endl<<ind<<endl;
        ss.clear();

        Process(p,coe,ind);
    }
    //if(!IsExt()) p = (Poly*)malloc(sizeof(Poly));
}

首先要讲多项式格式化,类似于+/- a*b^c。特殊情况会有两种,第一种是多项式第一项会省略+号,第二种是系数为1的时候会省略系数。
而此处核心思路是利用()将匹配出的字符串其中的单个元组格式化,统一为+/- a*b^c的格式以方便运算。
格式化之后将字符串流输入变量ss,此处使用字符串流将结果步步提取,放入相对应的变量中。

多项式运算

void Process(Poly *p,int coe,int ind){
    Poly *q;
    //不存在该指数
    if(!IsExt(ind,p)) {
        q = (Poly*)malloc(sizeof(Poly));
        q->coe=coe;
        q->ind=ind;
        q->next=NULL;
        while(p->next!=NULL) p=p->next;
        p->next=q;
    }
    else{
        q=p->next;
        while(ind!=q->ind) q=q->next;
        q->coe +=coe;
    }
}

IsExt函数会检测在链表中是否已存在该指数的节点,若存在,则直接运算结果;若不存在,则建立新节点,并放入数据。

输出结果

void Dis(Poly *p){
    Poly *q=p;
    int num=0;
    cout<<"多项式结果为:";
    for(q=q->next;q!=NULL;q=q->next){
        if(q->coe!=0){
            num++;
            if(num>1){
                if(q->coe<0) cout<<"-";
                else cout<<"+";
            }

            if(abs(q->coe)!=1) cout<<abs(q->coe);
            else if(q->ind==0) cout<<abs(q->coe);

            if (q->ind == 1)
                cout<<"x";
            else if(q->ind!=0)
                cout << "x^" << q->ind;
            //if (q->ind == 1)
            //  cout << abs(q->coe) << "x";
            //else if (q->ind == 0)
            //  cout << abs(q->coe);
            //else
            //  cout << abs(q->coe) << "x^" << q->ind;
        }
    }
    if(num==0) cout<<0<<endl;
}

与解析模块恰恰相反,输出时需注意:
1)根据系数正负号输出+/-;若系数为0,则不输出该项
2)首项系数若为正数,则省略’+’号
3)若系数为1,则省略系数
4)若指数为1,不应输出系数符号与指数

排序

排序模块中利用直接选择排序,将结果降序排列。

以上大概就是我所编写的多项式运算程序的大致过程与中心想法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值