回忆多项式解析运算思路
2016-06-07 20:08
323 查看
我觉得我编写这个多项式解析的过程中收获了很多,而且自己对成果也很满意,所以决定将过程与思路记录成博文。
首先是完整代码段的Github地址。
一元多项式无非只有系数和指数,所以定义结构体,其中coe存放系数,ind存放指数,并采用单链表链接各节点。
首先要讲多项式格式化,类似于+/- a*b^c。特殊情况会有两种,第一种是多项式第一项会省略+号,第二种是系数为1的时候会省略系数。
而此处核心思路是利用()将匹配出的字符串其中的单个元组格式化,统一为+/- a*b^c的格式以方便运算。
格式化之后将字符串流输入变量ss,此处使用字符串流将结果步步提取,放入相对应的变量中。
IsExt函数会检测在链表中是否已存在该指数的节点,若存在,则直接运算结果;若不存在,则建立新节点,并放入数据。
与解析模块恰恰相反,输出时需注意:
1)根据系数正负号输出+/-;若系数为0,则不输出该项
2)首项系数若为正数,则省略’+’号
3)若系数为1,则省略系数
4)若指数为1,不应输出系数符号与指数
以上大概就是我所编写的多项式运算程序的大致过程与中心想法。
首先是完整代码段的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++实现JNI接口需要注意的事项
- msql 正则表达式
- 正则表达式
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Mootools 1.2教程 正则表达式
- 批处理FINDSTR正则表达式用法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- vbs正则表达式代码
- C#正则表达式Regex类的常用匹配
- C++联合体转换成C#结构的实现方法
- C#中利用正则表达式将人民币金额转换为大写汉字
- C#使用正则表达式实现首字母转大写的方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题