![41aadbc698a3244a80a7f48879c22958.png](https://i-blog.csdnimg.cn/blog_migrate/57aadcc767b94153bb0c4b1c29703b09.jpeg)
国庆八天长假刚结束,2019级卓越班的同学们立刻进入了学习的状态,于2020年10月9日下午成功举行了第三次知识分享会。杨一达,于志强,王彤瑶三位同学为我们带来了《数据结构与算法》中经典例题的讲解,并分享了他们在各自完成过程中所积累的经验。
![520df11b1ef152515cb4aec4b9f51563.gif](https://i-blog.csdnimg.cn/blog_migrate/9d542488ff1a452c15bc8cce2a037ca4.gif)
![20f45a61353e669217feeb367bd330a5.png](https://i-blog.csdnimg.cn/blog_migrate/f9df3ea26102ab6daf4a020deb74b583.jpeg)
![8d26c4aada1a483d973f663998e70631.png](https://i-blog.csdnimg.cn/blog_migrate/a3dd14e201975104504f479e9c25ea1c.jpeg)
![e4bcfc9505ad682f476d9d7f5847947c.gif](https://i-blog.csdnimg.cn/blog_migrate/fefb51e066c8e3b0f2a58fbb232416cb.gif)
1.约瑟夫环问题
杨一达同学为我们讲解第一个问题——约瑟夫环。第一种方法使用单向循环链表,第二种方法使用双向循环链表。在第一种方法中,需要注意的是,在链表创建完成之后,应该返回的是最后一个结点的地址,这样方便后面的操作。在第二种方法里结构体中多出了一个指向前一个结点的指针,和一个表示方向的变量direction,0代表逆向,1代表正向。第二种方法的难点在于双向循环链表的创建与删除,删除必须把握好连接的顺序,否则会造成空指针异常。
![16626f6a7cbb7cfe1effe6b7a17a5d16.png](https://i-blog.csdnimg.cn/blog_migrate/929d297a4366d6cb8d35dfbbb2a1db74.jpeg)
![e246b8525f4bf944a384263678657f75.png](https://i-blog.csdnimg.cn/blog_migrate/f52bd7e1bf4dcd9229e43edbd0ed9b40.jpeg)
![85213be6ccd5bcbe32bcde6ad22c350c.png](https://i-blog.csdnimg.cn/blog_migrate/9f0b79b7766907fcb9c6d133ce2f27e4.png)
2.一元多项式计算
第二个问题是一元多项式的计算。在这道题目中,王彤瑶同学使用单向链表来解决一元多项式加法、减法、求导、乘法和求值运算。计算Pa、Pb两个多项式相加时,用Pc来存放其和,令qa、qb、qc分别指向单链表Pa、Pb和Pc的当前项。若qa所指向的节点的指数小于qb的,则将qa复制到qc中,令指针qa后移;若qa所指向的节点的指数等于qb的,则将qa的系数域与qb的系数域的和作为qc的系数域,qa、qb后移;若qa所指向节点的系数大于qb所指向节点的系数,则将qb复制到qc中,令指针qc后移。做减法计算时可以将减数Pb中的系数变为其相反数然后与Pa相加。在乘法计算中,将Pb看做一个整体,让Pa的每一项乘以Pb得到若干个多项式,再将他们相加。
![7fbc81474bc4047b4ea1044366f3cebf.png](https://i-blog.csdnimg.cn/blog_migrate/ca854390f683e0612638a3336c3eb47b.jpeg)
![520df11b1ef152515cb4aec4b9f51563.gif](https://i-blog.csdnimg.cn/blog_migrate/9d542488ff1a452c15bc8cce2a037ca4.gif)
3.表达式求值
最后一个问题是表达式求值。于志强同学所讲的表达式求值问题,可以在有括号的情况下进行加减乘除。首先利用一个结构体数组将运算符及其优先级存储起来,然后定义两个栈进行数字和运算符的存储。当遇到数字压入数字栈,遇到运算符则与运算符栈顶元素比较优先级,如果大于栈顶元素则入栈,否则弹出栈顶运算符进行运算,直到表达式字符串结束。
在分享过程中我们可以看到其他同学对于问题的求解思路,学习他人解决问题的方法,再比较自身,不断优化自己的程序,这也是我们提高自己代码质量的一个很好的途径。
知识的分享是学习的一种重要的方式,卓越班的分享会在进行课外的拓展与延申的同时,还密切关注着同学们在课堂上的热点与难点,并及时的通过知识分享帮助同学们更好的解决并理解这些问题。不要让想法停留在脑海,不要把问题停留心中,就在此刻努力,在未来一定能遇见更好的自己。
![5eedd1e80e2ae80b8598e29861e7b6e9.gif](https://i-blog.csdnimg.cn/blog_migrate/e557309488d4aad7cc460b427b79bfe7.gif)
![955d21cdd3e6e911bfdb6a77eac8dad5.png](https://i-blog.csdnimg.cn/blog_migrate/4310c990429d1da58d644969a9e23664.jpeg)
编 辑:王彤瑶
审 核:王世睿 曹永强
责任编辑:张子恒