多项式求解

来源:互联网 发布:淘宝大闸蟹生产许可证 编辑:程序博客网 时间:2024/05/16 09:39

  昨天写了个多项式求解的程序,从开始构思到完成调试大约用了5个小时。其中碰到不少小毛病,有的是类型不匹配,有的是端点的问题,弄得心烦意乱。于是写了个多项式,跟着程序走了一遍,终于把程序调试好。

实验的功能挺简单,只能进行单个数字的‘+’‘—’‘*’‘/’运算。如3+2*(5-3)/7

开始我没打算转成后缀表达式。想的是从开始扫描,找到‘(’就入堆栈,然后直到碰到下一个‘)’,运算其中的表达式,但是想了想还是不怎么好实现,决定用后缀表达式求解。其中用到了三个堆栈,stack<char> opr,stack<char> data ,stack<int> compute,opr存放运算符,data存放数字,这两个是在转换后缀中用的,compute是最后的求解中用的。

中缀表达式转成后缀表达式的计算机语言为:

(1):扫描字符串,如果是数字,压入data栈;

(2):A:如果是'(',直接压入opr中。

           B:如果是‘)’,则将opr中的操作符弹出压入data栈,直到碰到‘(’,并delete’(’;

           C:如果不是高级运算符,从栈顶开始依次弹出比当前运算符优先级高的运算符,压入data中,直到碰到一个不比他高的(如+碰到—,同一优先级,则停止)或者‘(’,则停止,并将该运算符压入data栈。

重复执行(1)(2)步,直到扫描完字符串,并将opr中的运算符出栈压入data。此时data中的就是后缀表达式。

但是如果我输入字符串是:((((a+b)/c)*d)-e)*(f*g),data存放的是ab+c/d*e-fg**,堆栈头为*,在计算是要先取ab+....所以我写了两个方法,Delete_Bottom,Get_Bottom,得到先入栈的元素和删除先入的,运用了对列的思想。

原创粉丝点击