表达式求值

//表达式求值用到栈的操作
#include"stdio.h"  
#include"stdlib.h"   
#include"string.h"   
#include"math.h"  
#define true 1   
#define false 0   
#define OPSETSIZE 8 
#include<iostream>
using namespace std;  
typedef int Status;   
  
unsigned char Prior[8][8] =  
{ // 运算符优先级表   
        // '+' '-' '*' '/' '(' ')' '#' '^'   
    /*'+'*/'>','>','<','<','<','>','>','<',   
    /*'-'*/'>','>','<','<','<','>','>','<',   
    /*'*'*/'>','>','>','>','<','>','>','<',   
    /*'/'*/'>','>','>','>','<','>','>','<',   
    /*'('*/'<','<','<','<','<','=',' ','<',   
    /*')'*/'>','>','>','>',' ','>','>','>',   
    /*'#'*/'<','<','<','<','<',' ','=','<',   
    /*'^'*/'>','>','>','>','<','>','>','>'   
};   
  
typedef struct StackChar  
{  
    char c;   
    struct StackChar *next;   
}SC;       //StackChar类型的结点SC  
  
typedef struct StackFloat  
{  
    float f;   
    struct StackFloat *next;   
}SF;       //StackFloat类型的结点SF  
  
SC *Push(SC *s,char c)          //SC类型的指针Push,返回p  
{  
    SC *p=(SC*)malloc(sizeof(SC));   
    p->c=c;   
    p->next=s;   
    return p;   
}   
  
SF *Push(SF *s,float f)        //SF类型的指针Push,返回p  
{  
    SF *p=(SF*)malloc(sizeof(SF));   
    p->f=f;   
    p->next=s;   
    return p;   
}   
  
SC *Pop(SC *s)    //SC类型的指针Pop  
{  
    SC *q=s;   
    s=s->next;   
    free(q);   
    return s;   
}   
  
SF *Pop(SF *s)      //SF类型的指针Pop  
{  
    SF *q=s;   
    s=s->next;   
    free(q);   
    return s;   
}   
  
float Operate(float a,unsigned char theta, float b)      //计算函数Operate  
{  
    switch(theta)  
    {  
	    case '+': return a+b;   
	    case '-': return a-b;   
	    case '*': return a*b;   
	    case '/': return a/b;   
	    case '^': return pow(a,b);   
	    default : return 0.0;   
    }   
}   


char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#','^'};   
  
Status In(char Test,char *TestOp)  
{  
    int Find=false;   
    for (int i=0; i< OPSETSIZE; i++)  
    {  
        if(Test == TestOp[i])  
            Find= true;   
    }   
    return Find;   
}   
  
Status ReturnOpOrd(char op,char *TestOp)  
{   
    for(int i=0; i< OPSETSIZE; i++)  
    {  
        if (op == TestOp[i])  
            return i;  
    }  
}  
  
char precede(char Aop, char Bop)  
{   
    return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];   
}   
  
float EvaluateExpression(char* MyExpression)  
{   
    // 算术表达式求值的算符优先算法  
    // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合   
    SC *OPTR=NULL;       // 运算符栈,字符元素   
    SF *OPND=NULL;       // 运算数栈,实数元素   
    char TempData[20];   
    float Data,a,b;   
    char theta,*c,Dr[]={'#','\0'};   
    OPTR=Push(OPTR,'#');   
    c=strcat(MyExpression,Dr);   
    strcpy(TempData,"\0");//字符串拷贝函数   
    while (*c!= '#' || OPTR->c!='#')  
    {   
        if (!In(*c, OPSET))  
        {   
            Dr[0]=*c;   
            strcat(TempData,Dr);           //字符串连接函数   
            c++;   
            if (In(*c, OPSET))  
            {   
                Data=atof(TempData);       //字符串转换函数(double)   
                OPND=Push(OPND, Data);   
                strcpy(TempData,"\0");   
            }   
        }   
        else    // 不是运算符则进栈   
        {  
            switch (precede(OPTR->c, *c))  
            {  
            case '<': // 栈顶元素优先级低   
                OPTR=Push(OPTR, *c);   
                c++;   
                break;   
            case '=': // 脱括号并接收下一字符   
                OPTR=Pop(OPTR);   
                c++;   
                break;   
            case '>': // 退栈并将运算结果入栈   
                theta=OPTR->c;OPTR=Pop(OPTR);   
                b=OPND->f;OPND=Pop(OPND);   
                a=OPND->f;OPND=Pop(OPND);
                cout<<"正在执行:" <<a<<theta<<b<<endl;  
                OPND=Push(OPND, Operate(a, theta, b));   
                break;   
            } //switch  
        }   
    }   
    return OPND->f;   
} //EvaluateExpression   
  
int main(void)  
{   
    char s[128];  
    while(1)
	{
		puts("请输入表达式(请使用英文字符):");
		gets(s);
		puts("该表达式的值为:");   
    	printf("%s\b=%g\n",s,EvaluateExpression(s));
	}   
    system("pause");  
    return 0;  
} 

以下为运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python表达式求值是指根据给定的Python表达式计算出结果的过程。它涉及解析表达式,按照运算符的优先级和结合性进行计算,并返回最终的结果。 在上述引用中,提到了一种方法来编程演示如何一步一步地计算Python表达式。这种方法涉及使用ast模块解析表达式为抽象语法树(AST),然后逐步求值AST节点。首先,使用ast.parse()将字符串解析为AST。然后,找到一个首先要求值的节点,并使用eval(compile(node, '', 'eval'))对其求值。求值结果可以转换回AST节点,并用结果节点替换当前节点。接着,使用codegen.to_source从修改后的AST生成修改后的代码字符串,并继续相同的过程,直到树中只有一个节点。 这种方法可以逐步展示Python表达式的求值过程。它可以用于教学目的,帮助学生理解表达式的求值方式。然而,需要注意的是,这种方法可能无法处理某些复杂的行为,比如列表理解。在处理这些复杂情况时,可能需要采用其他方法或工具。 总结:Python表达式求值是根据给定的表达式计算结果的过程。使用ast模块可以解析表达式为AST,并通过逐步求值AST节点来展示求值过程。然而,对于复杂的行为,可能需要其他方法或工具来处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [逐步跟踪Python表达式求值](https://blog.csdn.net/weixin_30982943/article/details/112956371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值