[原创]算术表达式求值演示
<br><br>我的一个同学找我搞定数据结构的实验报告,因为只有2天的时间,我就胡乱做了个。<br>下面是运行后生成的应用程序,给大家看看效果。(开始发的那个运行太快,看不见,请重新下载)<br>这是按照《数据结构习题集》严蔚敏版的实验2.5做的。<br>至于完整源代码,我下个星期5以后再发出来(呵呵,一点私心,防止上交的报告中有重复的)。<br>这里把关键的函数发出来。<br><br>int power(char x,int &base)// base用来保证括号内运算权限比括号外高(最关键的地方,运算符的权值设定)<br>{<br>int power;<br> if(x=='+'||x=='-')<br> power=base+1;<br>if(x=='*'||x=='/')<br> power=base+2;<br> if(x=='(')<br>{<br> power=3;<br> base+=3;<br>}<br>if(x==')')<br>{<br> power=-1;<br> base+=3;<br>}<br>if('0'<=x&&x<='9')<br> power=0;<br>}<br><br><br>void guocheng(char *infix)//整个算术表达式运算的过程,请在适当位置自行添加显示OPTR,OPND栈中内容和操作的函数(现在这个函数相当于算法)<br>{<br> int a,b,c,base=0,i;<br> char x,y;<br> <br> for (i = 0; infix[i] != '\0'; i++)<br> {<br> x=infix[i];<br> if (power(x)==0)//数字就入栈<br> {<br> a=x-'0';<br> push(opnd,a);<br> }<br> else if(power(x)==3)// 遇到'('就进栈<br> {<br> push(optr,c);<br> }<br> else if (power(x)==-1)//')',运算消除一对()<br> { <br> a=pop(opnd);<br> b=pop(opnd);<br> y=pop(optr);<br> c=math(b,y,a);<br> push(opnd,c); <br> y=pop(optr);<br> if(y=='('); //考虑如3+5*(3+5*6)<br> else<br> { <br> a=pop(opnd);<br> b=pop(opnd);<br> c=math(b,y,a);<br> push(opnd,c);<br> pop(optr);<br> }<br><br> }<br> else <br> {<br> if(power(x)>power(top(optr))) //如果运算符权值打于栈顶元素的权值,就入栈<br> push(optr,x);<br> else //权值相同情况下就先计算前面的。<br> {<br> a=pop(opnd);<br> b=pop(opnd);<br> y=pop(optr);<br> c=math(b,y,a);<br> push(opnd,c);<br> push(optr,x);<br> }<br> }<br> }//for<br> y=pop(optr);<br> while(y)<br> {<br> a=pop(opnd);<br> b=pop(opnd);<br> c=math(b,y,a);<br> push(opnd,c);<br> y=pop(optr);<br> }<br>}<br><br><br>[attach]3851[/attach]这个是老版本了,只有一个可执行文件,请到第3楼下载新版本,有原代码<br>[align=right][color=#000066][此贴子已经被作者于2006-4-25 10:46:35编辑过][/color][/align]
[align=right][color=#000066][此贴子已经被作者于2006-4-27 19:10:48编辑过][/color][/align]
<P>前几天忙着考试去了,没有按时发上来,不好意思啊。</P> <P>谢了,赞一个![em01]</P> <P>[em03]<BR><BR>看过或用过的朋友给 个意见啊,看看这个程序有什么BUG或不足啊?我好改进。<BR>希望各位不吝赐教啊</P> <P>你好,有没有详细的程序啊!!急用^^^^^^^^^^^</P> 哦 ,不好意思,刚才没看见,谢谢!!! <P>谢谢分享</P> <P>我也写了一个,支持float型数字……<BR>//建立栈类模板,在主函数中创建两个模板实例</P>
<P><BR>#include<process.h><BR>#include<string.h><BR>#define MAX_SIZE 100</P>
<P>template<class T>class Stack<BR>{<BR> T data[MAX_SIZE];<BR> int top;</P>
<P>public:</P>
<P> Stack(void);<BR> ~Stack(void);<BR> bool empty(void);<BR> void push(T a);<BR> T pop(void);<BR> T GetTop(void);<BR>};</P>
<P>template <class T>Stack<T>::Stack(void)//构造函数<BR>{<BR> top=-1;<BR>}</P>
<P>template <class T>Stack<T>::~Stack(void)//析构函数<BR>{<BR>}</P>
<P>template <class T>bool Stack<T>::empty(void)//判断栈空操作<BR>{<BR> return top==-1?true :false;<BR>}<BR>template <class T>void Stack<T>::push(T a)//入栈操作<BR>{<BR> if(top==MAX_SIZE)<BR> {<BR> cout<<"Stack is full!"<<endl;<BR> return;<BR> }</P>
<P> data[++top]=a;<BR>}</P>
<P>template <class T>T Stack<T>::pop(void)//出栈操作<BR>{<BR> if(top==-1)<BR> {<BR> cout<<"Stack is underflow!"<<endl;<BR> return 0;<BR> }<BR> return data[top--];<BR>}<BR>template <class T>T Stack<T>::GetTop(void)//取栈头元素操作<BR>{<BR> if(top!=-1)<BR> return data[top];<BR> else return false;<BR>}<BR>//计算表达式求值过程演示</P>
<P><BR>#include<iostream.h><BR>#include<stdio.h><BR>#include<math.h><BR>#include"tstack.h"</P>
<P>float Operate(float a,char theta,float b)<BR>{<BR> float s;<BR> switch(theta)<BR> {<BR> case'+': s=a+b;break;<BR> case'-': s=a-b;break;<BR> case'*': s=a*b;break;<BR> case'/': s=a/b;break;<BR> }<BR> return s;<BR>}</P>
<P><BR>char Precede(char a,char b)<BR>{<BR> char array[7][7]={'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=','0','>','>','>','>','0','>','>','<','<','<','<','<','0','='};</P>
<P> int i,j;</P>
<P> switch(a)<BR> {<BR> case'+': i=0;break;<BR> case'-': i=1;break;<BR> case'*': i=2;break;<BR> case'/': i=3;break;<BR> case'(': i=4;break;<BR> case')': i=5;break;<BR> case'#': i=6;break;<BR> }</P>
<P> switch(b)<BR> {<BR> case'+': j=0;break;<BR> case'-': j=1;break;<BR> case'*': j=2;break;<BR> case'/': j=3;break;<BR> case'(': j=4;break;<BR> case')': j=5;break;<BR> case'#': j=6;break;<BR> }</P>
<P> return(array[i][j]);<BR>}</P>
<P>void main()<BR>{<BR> char array[100],x,theta;<BR> char *p,*q,A='y';<BR> float s;<BR> int i;<BR> float v=0.0,a=0.0,b=0.0;<BR> cout<<'\t'<<'\t'<<"****************************************"<<endl;<BR> cout<<'\t'<<'\t'<<" 算术表达式求值 "<<endl;<BR> cout<<'\t'<<'\t'<<"****************************************"<<endl;<BR> cout<<'\t'<<'\t'<<" ------------中国科技大学-------------- "<<endl;<BR> cout<<'\t'<<'\t'<<"|作者: 老大的小猪 |"<<endl;<BR> cout<<'\t'<<'\t'<<"|______________________________________|"<<endl;<BR> <BR> while(A=='y')<BR> {<BR> cout<<"请输入表达式(以#号键结束):"<<endl;<BR> p=array;<BR> cin>>array; <BR> <BR> Stack<char>OPTR;<BR> Stack<float>OPND;</P>
<P> OPTR.push('#');<BR> <BR> while((*p)!='#'||OPTR.GetTop()!='#')<BR> {<BR> if((*p)>='0'&&(*p)<='9')<BR> {<BR> v=0.0;<BR> q=p;<BR> i=-1;<BR> while((*q)>='0'&&(*q)<='9'&&(*q)!='.')<BR> {<BR> i++;<BR> q++;<BR> }<BR> <BR> <BR> for(;i>=0;i--)<BR> {<BR> s=pow(10,i);<BR> v+=((*p)-'0')*s;<BR> p++;<BR> }</P>
<P> if((*p)=='.')<BR> {<BR> p++;<BR> while((*p)>='0'&&(*p)<='9')<BR> {<BR> s=pow(10,i);<BR> v+=((*p)-'0')*s;<BR> i--;<BR> p++;<BR> }<BR> }<BR> OPND.push(v);<BR> }<BR> else<BR> switch(Precede(OPTR.GetTop(),(*p)))<BR> {<BR> case '<':OPTR.push((*p));<BR> p++;break;<BR> case '=':x=OPTR.pop();<BR> p++;break;<BR> case '>':theta=OPTR.pop();<BR> b=OPND.pop();<BR> a=OPND.pop();<BR> OPND.push(Operate(a,theta,b));<BR> break;<BR> }<BR> }<BR> printf("%f\n",OPND.GetTop());<BR> cout<<"想继续吗(y/n)?";<BR> cin>>A;<BR> }<BR> <BR> <BR>}</P>
<P><BR> </P> 哈哈,不错不错,很有意思,待我下去好好研究下<br><br>顺便给个楼上的程序下载网页连接(EXE文件,没有原代码,原代码在楼上), 方便大家学习鉴赏<br><a href="http://www.bc-cn.net/bbs/dispbbs.asp?boardID=179&ID=60661&page=1" target="_blank" >http://www.bc-cn.net/bbs/dispbbs.asp?boardID=179&ID=60661&page=1</A>
[align=right][color=#000066][此贴子已经被作者于2006-4-27 18:57:26编辑过][/color][/align]
<P>强烈支持starrysky啊。。。。。数据结构版幸亏还有你在</P> <P>哇,给我扣了顶这么大的帽子,想不努力都不行啊.<br>欢迎回来, 激情!<br>这次怎么也该在静老大的数据结构历届斑竹名录里面留个名吧,不然就说不过去了啊, 你看热情都上榜n次了.</P>
[align=right][color=#000066][此贴子已经被作者于2006-4-29 21:15:55编辑过][/color][/align]
<P>顶,我们老师快下最后的通牒了.<BR>幸好找到了你们[em32][em32][em07][em11]</P> <P>[em17]顶一个先~``<BR>楼主有QQ么?<BR>有些问题想请教啊~~[em01]</P> <P>这个问题可以推广,比如加上乘方运算的表达式求值</P> <P>最近课程设计,刚好要做这个题目,谢谢啦~~^_^</P> <P>嘿嘿,楼主,谢谢了。<BR>我可以好好研究一下了。。。</P> <P>我下载了,但在TC上不能运行[em06][em06][em06]<BR><BR>请问是什么原因[em13][em13]</P> <P>程序运行的时候,如果输入错误的表达式,但是它还是会继续运行.<BR><BR> </P>
页:
[1]
2
