数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 5180|回复: 6

求助!表达式求值

[复制链接]
发表于 2004-12-26 09:40:31 | 显示全部楼层 |阅读模式
<>怎样编写一个算法实现表达式求值?最好是C++的,C语言的也行.请高手指教</P>
 楼主| 发表于 2004-12-27 00:09:14 | 显示全部楼层
<>这是我编写的程序。请帮我看看有没有什么错误,谢谢</P><>#define N 50
#define OK 1
#define ERROR 0
#include &lt;ctype.h&gt;
#include &lt;string.h&gt;
#include &lt;iostream.h&gt;
typedef struct{
    int top;
    double array[N];
}NumStack;
typedef struct{
    int top;
    char array[N];</P><>}OpStack;</P><P>int Cint(char mychar){</P><P>    return (mychar-48);</P><P>}</P><P> Push(NumStack &amp;numstack,double num){</P><P>    if(numstack.top&lt;N)</P><P>{numstack.top++;</P><P>     numstack.array[numstack.top-1]=num;
     return OK;</P><P>}</P><P>else return ERROR;</P><P>}
Pop(NumStack &amp;numstack,double &amp;num){</P><P>    if(numstack.top&gt;0){</P><P>num=numstack.array[numstack.top-1];</P><P>    numstack.top--;</P><P>    return OK;</P><P>}</P><P>else return ERROR;</P><P>}
Push(OpStack &amp;opstack,char &amp;op){</P><P>    if(opstack.top&lt;N){</P><P>opstack.top++;</P><P>    opstack.array[opstack.top-1]=op;
    return OK;</P><P>}</P><P>else return ERROR;</P><P>}
Poph(OpStack &amp;opstack,char &amp;op){</P><P>if(opstack.top&gt;0){ </P><P>op=opstack.array[opstack.top-1];</P><P>    opstack.top--;</P><P>return OK;</P><P>}</P><P>else return ERROR;</P><P>}
double Calc(double a,double b,char c){</P><P>    double result;</P><P>    switch(c){</P><P>        case '+':result=a+b;break;</P><P>        case '-':result=a-b;break;</P><P>        case '*':result=a*b;break;</P><P>        case '/':result=a/b;break;</P><P>    }</P><P>    return result;</P><P>}
char Priority(char y,char x){</P><P>        char priority='&lt;';</P><P>        switch(x){</P><P>            case '+':</P><P>            case '-':if(y=='(' || y=='#')priority='&gt;';break;</P><P>            case '*':</P><P>            case '/':if(y=='(' || y=='#'|| y=='+' || y=='-')priority='&gt;';break;</P><P>            case '(':priority='&gt;';break;</P><P>            case ')':if(y=='(')priority='=';break;</P><P>            case '#':if(y=='#')priority='=';break;</P><P>            default:priority='E';</P><P>        }</P><P>        return priority;</P><P>}
void Process(NumStack &amp;numstack,OpStack &amp;opstack,char x){</P><P>    double a,b;char c;</P><P>    static double tempnum=0.00000000;static int len=10;static int dot=0,flags=0;</P><P>    if(isdigit(x) || x=='.'){</P><P>        if(x=='.')dot=1;</P><P>        else{</P><P>            if(dot==0)</P><P>                tempnum=tempnum*10+Cint(x);</P><P>            else{</P><P>                tempnum=tempnum+(double)Cint(x)/len;</P><P>                len*=10;</P><P>            }</P><P>        }</P><P>    }</P><P>    else{</P><P>        if(flags==0 &amp;&amp; x!='('){Push(numstack,tempnum);tempnum=0.00000000;len=10;dot=0;}</P><P>        switch(Priority(opstack.array[opstack.top-1],x)){</P><P>            case '&gt;'ush(opstack,x);flags=0;break;</P><P>            case '&lt;':</P><P>                    Poph(opstack,&amp;c);</P><P>                    Pop(numstack,&amp;b);</P><P>                    Pop(numstack,&amp;a);</P><P>                    Push(numstack,Calc(a,b,c));flags=1;</P><P>                    Process(numstack,opstack,x);break;</P><P>            case '='oph(opstack,&amp;c);flags=1;break;</P><P>            default:printf("Wrong Express!");exit(0);</P><P>        }</P><P>    }</P><P>}
main(){</P><P>    NumStack numstack;OpStack opstack;char *s;int i=0;</P><P>    numstack.top=0;opstack.top=0;</P><P>    Push(&amp;opstack,'#');</P><P>    printf("\nEnter your expression adn end it with #:");scanf("%s",s);</P><P>    for(i=0;i&lt;strlen(s);i++)</P><P>    Process(&amp;numstack,&amp;opstack,s);</P><P>    printf("The result is %f",numstack.array[numstack.top-1]);</P><P>}</P>
 楼主| 发表于 2004-12-27 08:04:42 | 显示全部楼层
怎么?这里没高手吗?怎么没人帮忙啊。。。
发表于 2004-12-30 02:17:43 | 显示全部楼层
<>我有两个例子(推荐第二个),都是Flash版的
<a href="http://www.5dblog.com/user2/jh7086/index.asp?id=39126" target="_blank" >http://www.5dblog.com/user2/jh7086/index.asp?id=39126</A>
第一个例子是按 中缀转后缀再对后缀求值的方法做的,写得比较乱,而且不能使用函数,实用价值不大</P>
<><a href="http://www.5dblog.com/user2/jh7086/index.asp?id=41259" target="_blank" >http://www.5dblog.com/user2/jh7086/index.asp?id=41259</A>
第二个例子是按人的解题步骤:从左到右查找最内层的括号,然后将括号内的表达式按运算符优先级计算。。。
代码写得比前一个好些,而且实现了函数的使用。但是要将这个变成C++版的不知道可行否,我没学C++,不知道
里面处理字符串是否象Flash里那么简单。
不管怎样,提供一个思路
这是我所参考的资料(JAVA实现):<a href="http://www-900.ibm.com/developerWorks/cn/java/j-w3eva/index.shtml" target="_blank" >http://www-900.ibm.com/developerWorks/cn/java/j-w3eva/index.shtml</A></P>
发表于 2005-12-6 01:09:08 | 显示全部楼层
<>上面2楼的高手,可不可以帮我写下关于词法分析器、LR语法分析器、中缀转后缀的C语言程序?拜托了,哪怕其中的一篇都行那,其余的我再想办法。虽然网上也比较多,但是,我们班的同学早就抄先了,老师都说了不能一样的模式,一听这话就傻了眼了,还望你能帮帮忙,先谢过了,如果楼内还有其他高手,麻烦也能伸伸援手,也先谢过了,实在是不会做啊</P>[em04]
发表于 2005-12-10 05:43:54 | 显示全部楼层
直接用lex和yacc生成一个
发表于 2005-12-10 05:44:53 | 显示全部楼层
5楼的,用lex和yacc生成一个
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 06:22 , Processed in 0.052017 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表