当前位置:   article > 正文

数据结构与算法笔记--基于STL实现多项式的加法和乘法_数据结构的加法数乘内积

数据结构的加法数乘内积

1--多项式加法

        传入存储两个多项式的 List 链表,使用迭代器进行遍历,比较其指数的三种情况,将结果存储到新的多项式 List 链表之中;

  1. std::list<PolyNode> PolyAdd(std::list<PolyNode> P1, std::list<PolyNode> P2){
  2. std::list<PolyNode> P3;
  3. std::list<PolyNode>::iterator p1 = P1.begin();
  4. std::list<PolyNode>::iterator p2 = P2.begin();
  5. PolyNode tmp(0, 0);
  6. while(p1 != P1.end() && p2 != P2.end()){
  7. switch(compare(p1->expon, p2->expon)){
  8. case 1:
  9. P3.push_back(*p1);
  10. p1++;
  11. break;
  12. case -1:
  13. P3.push_back(*p2);
  14. p2++;
  15. break;
  16. case 0:
  17. tmp.coef = p1->coef + p2->coef;
  18. tmp.expon = p1->expon;
  19. p1++;
  20. p2++;
  21. if(tmp.coef == 0){
  22. break;
  23. }
  24. P3.push_back(tmp);
  25. break;
  26. }
  27. }
  28. for(; p1 != P1.end(); p1++) P3.push_back(*p1);
  29. for(; p2 != P2.end(); p2++) P3.push_back(*p2);
  30. return P3;
  31. }

2--多项式乘法

        传入存储两个多项式的 List 链表,使用双重循环计算乘积;

        判断结果表达式是否存在,不存在则直接插入新链表中,存在则进行合并;

        最后对结果多项式进行排序,并返回;

  1. std::list<PolyNode> PolyMul(std::list<PolyNode> P1, std::list<PolyNode> P2){
  2. std::list<PolyNode> P3;
  3. std::list<PolyNode>::iterator p1 = P1.begin();
  4. std::list<PolyNode>::iterator p2 = P2.begin();
  5. PolyNode tmp(0, 0);
  6. while(p1 != P1.end()){
  7. while(p2 != P2.end()){
  8. tmp.coef = p1->coef * p2->coef;
  9. tmp.expon = p1->expon + p2->expon;
  10. std::list<PolyNode>::iterator it = find(P3.begin(), P3.end(), tmp);
  11. if(it != P3.end()){
  12. it->coef += tmp.coef;
  13. if (it->coef == 0) P3.erase(it);
  14. }
  15. else P3.push_back(tmp);
  16. p2++;
  17. }
  18. p1++;
  19. p2 = P2.begin();
  20. }
  21. P3.sort(MyCompare());
  22. return P3;
  23. }

3--测试代码

        控制台输入多项式时,第一个数字表示项数N,接着每两个数字表示对应项式的系数和指数;

        STL提供的 List 容器,不能使用标准的 sort 算法,需要使用容器内置的排序算法;

  1. #include "iostream"
  2. #include <list>
  3. #include "algorithm"
  4. #include "functional"
  5. class PolyNode{
  6. public:
  7. PolyNode(int c, int e){
  8. this->coef = c;
  9. this->expon = e;
  10. }
  11. // 重载 == 号, 便于find()函数进行比较
  12. bool operator==(const PolyNode &p){
  13. if(this->expon == p.expon) return true;
  14. else return false;
  15. }
  16. int coef;
  17. int expon;
  18. };
  19. void ReadPolyNode(std::list<PolyNode> &P){
  20. int N;
  21. int c;
  22. int e;
  23. PolyNode tmp(0, 0);
  24. std::cin >> N;
  25. while(N--){
  26. std::cin >> c >> e;
  27. tmp.coef = c;
  28. tmp.expon = e;
  29. P.push_back(tmp);
  30. }
  31. }
  32. class MyCompare{
  33. public:
  34. bool operator()(const PolyNode &p1, const PolyNode &p2){
  35. return p1.expon > p2.expon;
  36. }
  37. };
  38. int compare(int A, int B){
  39. if(A > B) return 1;
  40. else if(A < B) return -1;
  41. else return 0;
  42. }
  43. std::list<PolyNode> PolyAdd(std::list<PolyNode> P1, std::list<PolyNode> P2){
  44. std::list<PolyNode> P3;
  45. std::list<PolyNode>::iterator p1 = P1.begin();
  46. std::list<PolyNode>::iterator p2 = P2.begin();
  47. PolyNode tmp(0, 0);
  48. while(p1 != P1.end() && p2 != P2.end()){
  49. switch(compare(p1->expon, p2->expon)){
  50. case 1:
  51. P3.push_back(*p1);
  52. p1++;
  53. break;
  54. case -1:
  55. P3.push_back(*p2);
  56. p2++;
  57. break;
  58. case 0:
  59. tmp.coef = p1->coef + p2->coef;
  60. tmp.expon = p1->expon;
  61. p1++;
  62. p2++;
  63. if(tmp.coef == 0){
  64. break;
  65. }
  66. P3.push_back(tmp);
  67. break;
  68. }
  69. }
  70. for(; p1 != P1.end(); p1++) P3.push_back(*p1);
  71. for(; p2 != P2.end(); p2++) P3.push_back(*p2);
  72. return P3;
  73. }
  74. std::list<PolyNode> PolyMul(std::list<PolyNode> P1, std::list<PolyNode> P2){
  75. std::list<PolyNode> P3;
  76. std::list<PolyNode>::iterator p1 = P1.begin();
  77. std::list<PolyNode>::iterator p2 = P2.begin();
  78. PolyNode tmp(0, 0);
  79. while(p1 != P1.end()){
  80. while(p2 != P2.end()){
  81. tmp.coef = p1->coef * p2->coef;
  82. tmp.expon = p1->expon + p2->expon;
  83. std::list<PolyNode>::iterator it = find(P3.begin(), P3.end(), tmp);
  84. if(it != P3.end()){
  85. it->coef += tmp.coef;
  86. if (it->coef == 0) P3.erase(it);
  87. }
  88. else P3.push_back(tmp);
  89. p2++;
  90. }
  91. p1++;
  92. p2 = P2.begin();
  93. }
  94. P3.sort(MyCompare());
  95. return P3;
  96. }
  97. void MyPrint(PolyNode p){
  98. std::cout << "coef: " << p.coef << " expon: " << p.expon << std::endl;
  99. }
  100. int main(int argc, char* argv[]){
  101. std::list<PolyNode> P1;
  102. std::list<PolyNode> P2;
  103. ReadPolyNode(P1);
  104. ReadPolyNode(P2);
  105. std::cout << "Add:--------------------" << std::endl;
  106. std::list<PolyNode> P3 = PolyAdd(P1, P2);
  107. for_each(P3.begin(), P3.end(), MyPrint);
  108. std::cout << "Mul:--------------------" << std::endl;
  109. std::list<PolyNode> P4 = PolyMul(P1, P2);
  110. for_each(P4.begin(), P4.end(), MyPrint);
  111. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/868864
推荐阅读
相关标签
  

闽ICP备14008679号