科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件求值表达式

求值表达式

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

所谓的求值表达式,就是给出一个中缀表达式,然后要求将它转换成后追表达式,再利用后缀表达式求出它的值。

作者:chailang 来源:CSDN 2008年3月23日

关键字: C C++ 求值 表达式 Linux

  • 评论
  • 分享微博
  • 分享邮件
所谓的求值表达式,就是给出一个中缀表达式,然后要求将它转换成后追表达式,再利用后缀表达式求出它的值。
例如:(45-35)/(65-62)这是一个中缀表达式,要求将它转换成后缀表达式,为45#35#—65#62#+/,计算的时候,首先将后缀表达式的数相计算,如此例题,首先是 45,然后接下来是35,再接着是—,于是,就成为45-35,计算出结果是10,10有相当于一个数,和接下来的65又成两个数,即10,65,然后后面没有运算符号,将后面的数字在和他们在一起 ,用专业术语,即进栈,就成为了10,65,62,接下来遇见的是+,又要出来最后的两个数,把65,62出来,相加,即65+62,答案是127,然后栈变成了10,127,最后的符号是/,两个数于是进行除法运算,即10/127。
中缀表达式:就是预算夫位于两个数字的中间的表达式,比如:2+4,就是一个中缀表达式,中缀表达式我们平常接触的多很多了,就没有必要多讲,平常在数学上面运用的基本都是中缀表达式,没有用到后缀表达式。后缀表达式,就是运算符号在操作数的后面,例如123*-,就是一个后缀表达式,他已经考虑到了运算符的优先顺序,我们也没有必要考虑到哪一点,还有一点就是后缀表达式里面不可能有()号。
后缀表达式的求值过程关键就是要理解栈,要把栈的一切远离都弄明白,那计算后追表达式就很容易了。求后缀表达式的过程是:从左到右,假如读入的是一个数字,就将他入栈,如果是一个运算符,就将栈内的前面的两个操作数出栈,然后和运算符在一起,计算出结果,然后再将结果如栈。
求值表达式的具体的程序用c语言表示为:
#include<stdio.h>
#define MaxSize 99
void trans(char str[],char exp[])   /*将算术表达式转换成后追表达式*/
{
       struct
       {
              char data[MaxSize];
              int top;                  /*top为栈顶*/
       }op;                          /*定义一个含data和top的结构体*/
       char ch;                    
       int i=0,t=0;
       op.top=-1;
       ch=str[i];                    /*将str的每一个数转换成ch*/
       i++;
       while(ch!='\0')               /*ch对应不同的符号的时候对应的转换情况*/
       {
              switch(ch)
              {
              case'(':                /*当是(的时候,将此括号存入栈tp*/
                     op.top++;op.data[op.top]=ch;
                     break;
              case')':              
                     while(op.data[op.top]!='(')    
                     {
                            exp[t]=op.data[op.top];
                            op.top--;
                            t++;
                     }
                     op.top--;
                     break;
              case'+':
              case'-':
                     while(op.top!=-1&&op.data[op.top]!='(')
                     {
                            exp[t]=op.data[op.top];
                            op.top--;
                            t++;
                     }
                     op.top++;
                     op.data[op.top]=ch;
                     break;
              case'*':
              case'/':
                     while(op.top=='/'||op.top=='*')
                     {
                            exp[t]=op.data[op.top];
                            op.top--;
                            t++;
                     }
                     op.top++;
                     op.data[op.top]=ch;
                     break;
              case' ':
                     break;
              default:
                     while(ch>='0'&&ch<='9')
                     {
                            exp[t]=ch;t++;
                            ch=str[i];i++;
                     }
                     i--;
                     exp[t]='#';
                     t++;
              }
              ch=str[i];
              i++;
       }
       while(op.top!=-1)
       {
              exp[t]=op.data[op.top];
              t++;
              op.top--;
       }
       exp[t]='\0';
}
float compvalue(char exp[])
{
       struct
       {
              float data[MaxSize];
              int top;
       }st;
       float d;
       char ch;
       int t=0;
       st.top=-1;
       ch=exp[t];
       t++;
       while(ch!='\0')
       {
              switch(ch)
              {
       case'+':
              st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];
              st.top--;
              break;
       case'-':
              st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
              st.top--;
              break;
       case'*':
              st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
              st.top--;
              break;
       case'/':
       if(st.data[st.top]!=0)
              st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
       else
       {
              printf("\n\t除0是错误的");
       }
       st.top--;
       break;
       default:;
              d=0;
              while(ch>='0'&&ch<='9')
              {
                     d=10*d+ch-'0';
                     ch=exp[t];
                     t++;
              }
              st.top++;
              st.data[st.top]=d;
              }
       ch=exp[t];
       t++;
       }
       return st.data[st.top];
}
void main()                              /*可以提到前面去*/
{
       char str[MaxSize],exps[MaxSize];     /*str为算术表达式,exps为后缀表达式*/
       printf("请输入一个求值表达式\n");
       printf("表达式:");
       gets(str);                           /*输入一个算术表达式*/
       printf("原表达式是:%s\n",str);
       trans(str,exps);                     /*将算术表达式转换成后追表达式*/
       printf("后缀表达式:%s\n",exps);
       printf("计算结果:%g\n",compvalue(exps));/*通过后缀表达式来求值*/
}
  这是一个正确的关于求值表达式的程序,可以在vc++上面运行,如果感到有兴趣,可以自己运行一下,可以将各种算术表达式即中缀表达式转换成后缀表达式,然后再计算出结果。
 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章