您的位置:首页 > 编程语言 > C语言/C++

回忆多项式解析运算思路

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

首先是完整代码段的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,不应输出系数符号与指数

排序

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

以上大概就是我所编写的多项式运算程序的大致过程与中心想法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式 C++