国庆八天长假刚结束,2019级卓越班的同学们立刻进入了学习的状态,于2020年10月9日下午成功举行了第三次知识分享会。杨一达,于志强,王彤瑶三位同学为我们带来了《数据结构与算法》中经典例题的讲解,并分享了他们在各自完成过程中所积累的经验。
1.约瑟夫环问题
杨一达同学为我们讲解第一个问题——约瑟夫环。第一种方法使用单向循环链表,第二种方法使用双向循环链表。在第一种方法中,需要注意的是,在链表创建完成之后,应该返回的是最后一个结点的地址,这样方便后面的操作。在第二种方法里结构体中多出了一个指向前一个结点的指针,和一个表示方向的变量direction,0代表逆向,1代表正向。第二种方法的难点在于双向循环链表的创建与删除,删除必须把握好连接的顺序,否则会造成空指针异常。
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得到若干个多项式,再将他们相加。
3.表达式求值
最后一个问题是表达式求值。于志强同学所讲的表达式求值问题,可以在有括号的情况下进行加减乘除。首先利用一个结构体数组将运算符及其优先级存储起来,然后定义两个栈进行数字和运算符的存储。当遇到数字压入数字栈,遇到运算符则与运算符栈顶元素比较优先级,如果大于栈顶元素则入栈,否则弹出栈顶运算符进行运算,直到表达式字符串结束。
在分享过程中我们可以看到其他同学对于问题的求解思路,学习他人解决问题的方法,再比较自身,不断优化自己的程序,这也是我们提高自己代码质量的一个很好的途径。
知识的分享是学习的一种重要的方式,卓越班的分享会在进行课外的拓展与延申的同时,还密切关注着同学们在课堂上的热点与难点,并及时的通过知识分享帮助同学们更好的解决并理解这些问题。不要让想法停留在脑海,不要把问题停留心中,就在此刻努力,在未来一定能遇见更好的自己。
编 辑:王彤瑶
审 核:王世睿 曹永强
责任编辑:张子恒