表达式求值

Posted 南笙一梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式求值相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

#define MaxSize 20
#define MaxOp 7

struct    //设定运算符的优先级

    char ch;    //运算符
    int pri;    //优先级
lpri[] = '=',0,'(',1,'*',5,'/',5,'+',3,'-',3,')',6,
 rpri[] = '=',0,'(',6,'*',4,'/',4,'+',2,'-',2,')',1;

int leftpri(char op)    //求左运算符op的优先级

    int i;
    for(i = 0; i<MaxOp; i++)
        if(lpri[i].ch == op)
            return lpri[i].pri;

int rightpri(char op)    //求右运算符op的优先级

    int i;
    for(i = 0; i<MaxOp; i++)
        if(rpri[i].ch == op)
            return rpri[i].pri;

bool InOp(char ch)    //判断ch是否为运算符

    if(ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '*' || ch == '/')
        return true;
    else
        return false;


int Precede(char op1, char op2)    //op1 和 op2运算符优先级的比较结果

    if(leftpri(op1) == rightpri(op2))
        return 0;
    else if(leftpri(op1) < rightpri(op2))
        return -1;
    else
        return 1;


void trans(char *exp, char postexp[])

    struct
    
        char data[MaxSize];
        int top;
    op;
    int i = 0;
    op.top = -1;
    op.top++;
    op.data[op.top] = '=';
    while(*exp != '\\0')
    
        if(!InOp(*exp))
        
            while(*exp >= '0' && *exp <='9')
            
                postexp[i++] = *exp;
                exp++;
            
            postexp[i++] = '#';
        
        else
        
            switch(Precede(op.data[op.top],*exp))
            
                case -1:
                    op.top++;
                    op.data[op.top] = *exp;
                    exp++;
                    break;
                case 0:
                    op.top--;
                    exp++;
                    break;
                case 1:
                    postexp[i++] = op.data[op.top];
                    op.top--;
                    break;
            
        
    
    while(op.data[op.top] != '=')
    
        postexp[i++] = op.data[op.top];
        op.top--;
    
    postexp[i] = '\\0';


float compvalue(char * postexp)

    struct
    
        float data[MaxSize];
        int top;
    st;
    float d,a,b,c;
    st.top = -1;
    while (*postexp != '\\0')
    
        switch(*postexp)
        
            case '+':
                a = st.data[st.top];
                st.top--;
                b = st.data[st.top];
                st.top--;
                c = a+b;
                st.top++;
                st.data[st.top] = c;
                break;
            case '-':
                a = st.data[st.top];
                st.top--;
                b = st.data[st.top];
                st.top--;
                c = b-a;
                st.top++;
                st.data[st.top] = c;
                break;
            case '*':
                a = st.data[st.top];
                st.top--;
                b = st.data[st.top];
                st.top--;
                c = a*b;
                st.top++;
                st.data[st.top] = c;
                break;
            case '/':
                a = st.data[st.top];
                st.top--;
                b = st.data[st.top];
                st.top--;
                if(a != 0)
                
                    c = b/a;
                    st.top++;
                    st.data[st.top] = c;
                
                else
                
                    printf("\\n\\t除零错误!\\n");
                    exit(0);
                
                break;
            default:
                d = 0;
                while(*postexp >= '0' && *postexp <='9')
                
                    d = 10 * d + *postexp - '0';
                    postexp++;
                
                st.top++;
                st.data[st.top] = d;
                break;
        
        postexp++;
    
    return (st.data[st.top]);


int main()

    char exp[MaxSize];
    char postexp[MaxSize];
    while(true)
    
        printf("请输入表达式:");
        gets(exp);
        trans(exp, postexp);
        printf("表达式的值:%g\\n",compvalue(postexp));
    
    return 0;


心得体会:栈的东西,一定要注意指针的移动,指向的位置。

以上是关于表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

C语言关于表达式求值

如果表达式的求值需要对引用求值,为啥它不是“核心常量表达式”?

C语言编一个实现简单的算术表达式求值的代码。

C语言编程-逆波兰表达式求值

C语言 任意表达式求值。(栈的应用

python 短路求值或惰性求值