starrysky 发表于 2005-11-24 11:14

[原创]算术表达式求值演示

<br><br>我的一个同学找我搞定数据结构的实验报告,因为只有2天的时间,我就胡乱做了个。<br>下面是运行后生成的应用程序,给大家看看效果。(开始发的那个运行太快,看不见,请重新下载)<br>这是按照《数据结构习题集》严蔚敏版的实验2.5做的。<br>至于完整源代码,我下个星期5以后再发出来(呵呵,一点私心,防止上交的报告中有重复的)。<br>这里把关键的函数发出来。<br><br>int power(char x,int &amp;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'&lt;=x&amp;&amp;x&lt;='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)&gt;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]

starrysky 发表于 2005-11-24 11:28

说明一下,像2*<FONT color=#e61a1a>2(</FONT>1+1)这样数子后面直接接'('的表达式非法,<FONT color=#f73809>12</FONT>+1这种数字超过了9的表达式非法

starrysky 发表于 2005-12-25 13:27

[attach]4390[/attach]<br>
[align=right][color=#000066][此贴子已经被作者于2006-4-27 19:10:48编辑过][/color][/align]

starrysky 发表于 2005-12-25 13:34

<P>前几天忙着考试去了,没有按时发上来,不好意思啊。</P>

muyilion 发表于 2005-12-27 19:08

<P>谢了,赞一个![em01]</P>

starrysky 发表于 2006-1-13 11:59

<P>[em03]<BR><BR>看过或用过的朋友给 个意见啊,看看这个程序有什么BUG或不足啊?我好改进。<BR>希望各位不吝赐教啊</P>

shenjun 发表于 2006-3-6 17:52

<P>你好,有没有详细的程序啊!!急用^^^^^^^^^^^</P>

shenjun 发表于 2006-3-6 18:00

哦 ,不好意思,刚才没看见,谢谢!!!

poster214 发表于 2006-4-24 09:48

<P>谢谢分享</P>

xiao_pig 发表于 2006-4-27 18:40

<P>我也写了一个,支持float型数字……<BR>//建立栈类模板,在主函数中创建两个模板实例</P>

<P><BR>#include&lt;process.h&gt;<BR>#include&lt;string.h&gt;<BR>#define MAX_SIZE  100</P>
<P>template&lt;class T&gt;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 &lt;class T&gt;Stack&lt;T&gt;::Stack(void)//构造函数<BR>{<BR> top=-1;<BR>}</P>
<P>template &lt;class T&gt;Stack&lt;T&gt;::~Stack(void)//析构函数<BR>{<BR>}</P>
<P>template &lt;class T&gt;bool Stack&lt;T&gt;::empty(void)//判断栈空操作<BR>{<BR> return top==-1?true :false;<BR>}<BR>template &lt;class T&gt;void Stack&lt;T&gt;::push(T a)//入栈操作<BR>{<BR> if(top==MAX_SIZE)<BR> {<BR>  cout&lt;&lt;"Stack is full!"&lt;&lt;endl;<BR>  return;<BR> }</P>
<P> data[++top]=a;<BR>}</P>
<P>template &lt;class T&gt;T Stack&lt;T&gt;::pop(void)//出栈操作<BR>{<BR> if(top==-1)<BR> {<BR>  cout&lt;&lt;"Stack is underflow!"&lt;&lt;endl;<BR>  return 0;<BR> }<BR> return data[top--];<BR>}<BR>template &lt;class T&gt;T Stack&lt;T&gt;::GetTop(void)//取栈头元素操作<BR>{<BR> if(top!=-1)<BR>     return data[top];<BR> else return false;<BR>}<BR>//计算表达式求值过程演示</P>

<P><BR>#include&lt;iostream.h&gt;<BR>#include&lt;stdio.h&gt;<BR>#include&lt;math.h&gt;<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]={'&gt;','&gt;','&lt;','&lt;','&lt;','&gt;','&gt;','&gt;','&gt;','&lt;','&lt;','&lt;','&gt;','&gt;','&gt;','&gt;','&gt;','&gt;','&lt;','&gt;','&gt;','&gt;','&gt;','&gt;','&gt;','&lt;','&gt;','&gt;','&lt;','&lt;','&lt;','&lt;','&lt;','=','0','&gt;','&gt;','&gt;','&gt;','0','&gt;','&gt;','&lt;','&lt;','&lt;','&lt;','&lt;','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&lt;&lt;'\t'&lt;&lt;'\t'&lt;&lt;"****************************************"&lt;&lt;endl;<BR> cout&lt;&lt;'\t'&lt;&lt;'\t'&lt;&lt;"            算术表达式求值              "&lt;&lt;endl;<BR> cout&lt;&lt;'\t'&lt;&lt;'\t'&lt;&lt;"****************************************"&lt;&lt;endl;<BR> cout&lt;&lt;'\t'&lt;&lt;'\t'&lt;&lt;" ------------中国科技大学-------------- "&lt;&lt;endl;<BR> cout&lt;&lt;'\t'&lt;&lt;'\t'&lt;&lt;"|作者:        老大的小猪              |"&lt;&lt;endl;<BR> cout&lt;&lt;'\t'&lt;&lt;'\t'&lt;&lt;"|______________________________________|"&lt;&lt;endl;<BR> <BR>    while(A=='y')<BR> {<BR>  cout&lt;&lt;"请输入表达式(以#号键结束):"&lt;&lt;endl;<BR>  p=array;<BR>  cin&gt;&gt;array; <BR> <BR>     Stack&lt;char&gt;OPTR;<BR>     Stack&lt;float&gt;OPND;</P>
<P>        OPTR.push('#');<BR> <BR>     while((*p)!='#'||OPTR.GetTop()!='#')<BR>  {<BR>     if((*p)&gt;='0'&amp;&amp;(*p)&lt;='9')<BR>     {<BR>       v=0.0;<BR>       q=p;<BR>       i=-1;<BR>          while((*q)&gt;='0'&amp;&amp;(*q)&lt;='9'&amp;&amp;(*q)!='.')<BR>    {<BR>         i++;<BR>         q++;<BR>    }<BR>     <BR>        <BR>       for(;i&gt;=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)&gt;='0'&amp;&amp;(*p)&lt;='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 '&lt;':OPTR.push((*p));<BR>             p++;break;<BR>       case '=':x=OPTR.pop();<BR>             p++;break;<BR>       case '&gt;':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&lt;&lt;"想继续吗(y/n)?";<BR>     cin&gt;&gt;A;<BR> }<BR>     <BR> <BR>}</P>
<P><BR>    </P>

starrysky 发表于 2006-4-27 18:54

哈哈,不错不错,很有意思,待我下去好好研究下<br><br>顺便给个楼上的程序下载网页连接(EXE文件,没有原代码,原代码在楼上), 方便大家学习鉴赏<br><a href="http://www.bc-cn.net/bbs/dispbbs.asp?boardID=179&amp;ID=60661&amp;page=1" target="_blank" >http://www.bc-cn.net/bbs/dispbbs.asp?boardID=179&amp;ID=60661&amp;page=1</A>
[align=right][color=#000066][此贴子已经被作者于2006-4-27 18:57:26编辑过][/color][/align]

激情依旧 发表于 2006-4-29 11:35

<P>强烈支持starrysky啊。。。。。数据结构版幸亏还有你在</P>

starrysky 发表于 2006-4-29 12:02

<P>哇,给我扣了顶这么大的帽子,想不努力都不行啊.<br>欢迎回来, 激情!<br>这次怎么也该在静老大的数据结构历届斑竹名录里面留个名吧,不然就说不过去了啊, 你看热情都上榜n次了.</P>
[align=right][color=#000066][此贴子已经被作者于2006-4-29 21:15:55编辑过][/color][/align]

pniyik 发表于 2006-5-6 09:44

<P>顶,我们老师快下最后的通牒了.<BR>幸好找到了你们[em32][em32][em07][em11]</P>

jusdin 发表于 2006-6-8 22:04

<P>[em17]顶一个先~``<BR>楼主有QQ么?<BR>有些问题想请教啊~~[em01]</P>

乌鸦丘比特 发表于 2006-6-9 08:29

<P>这个问题可以推广,比如加上乘方运算的表达式求值</P>

dreamsdeng 发表于 2006-6-20 00:36

<P>最近课程设计,刚好要做这个题目,谢谢啦~~^_^</P>

xinghui 发表于 2006-6-21 00:25

<P>嘿嘿,楼主,谢谢了。<BR>我可以好好研究一下了。。。</P>

HELLO0 发表于 2006-6-22 15:48

<P>我下载了,但在TC上不能运行[em06][em06][em06]<BR><BR>请问是什么原因[em13][em13]</P>

方方 发表于 2006-6-29 13:22

<P>程序运行的时候,如果输入错误的表达式,但是它还是会继续运行.<BR><BR>  </P>

页: [1] 2

编程论坛