栈的应用---表达式求值

本文介绍了栈在计算中缀表达式时的重要性,特别是后缀表达式的使用,它消除了优先级规则的复杂性。通过`Precede`函数判断运算符优先级,并在`EvaluateExpression`函数中实现后缀表达式的计算过程,将中缀表达式转换为后缀表达式并进行求值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表达式求值是栈的一个重要的应用。例如计算器中的加减乘除表达式的计算,都会使用栈来进行求值。
表达式的表示方法主要有中缀表示法和后缀表示法。

中缀表示法:操作符号处于两个操作数的中间例如3+4,中缀表达式是符合人们思维的算术表达式方法,中缀表达式通常包含圆括号和方括号。中缀表达式不容易被计算机所理解,因此不太方便使用其进行表达式求值。

后缀表达式的例子21+3*,它 对应中缀表达式为(2+1)*3, 中缀表示的例子 1 +3 * (4 + 5)

后缀表达式:不包含括号,运算符号放在两个运算对象的后面,所有的计算按运算符号出现的顺序,严格的从左向右进行运算(不再需要考虑运算符号的优先规则)。


需要比较运算符的优先级:

char Precede(char a, char b){
    int i,j;
    char pre[][7]={         
	/*运算符之间的优先级制作成一张表格*/
        {'>','>','<','<','<','>','>'},
        {'>','>','<','<','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'<','<','<','<','<','=','0'},
        {'>','>','>','>','0','>','>'},
        {'<','<','<','<','<','0','='}};
    switch(a){
        case '+': i=0; break;
        case '-': i=1; break;
        case '*': i=2; break;
        case '/': i=3; break;
        case '(': i=4; break;
        case ')': i=5; break;
        case '#': i=6; break;
    }
    switch(b){
        case '+': j=0; break;
        case '-': j=1; break;
        case '*': j=2; break;
        case '/': j=3; break;
        case '(': j=4; break;
        case ')': j=5; break;
        case '#': j=6; break;
    }
    return pre[i][j];
}

 
int EvaluateExpression(){
 
    int n;
    int flag;
    int c;
    char x,theta;
    int a,b;
 
    char OP[]="+-*/()#";
    SqStack  OPTR;
    SqStack  OPND;
 
    InitStack(&OPTR);      
    Push(&OPTR,'#');
    InitStack(&OPND);
    flag=getNext(&c);
 
    GetTop(OPTR, &x);
    while(c!='#' || x != '#')
    {
        if(flag == 0)
	     {
                  Push(&OPND,c);
                  flag = getNext(&c);
             }        else
	{
            GetTop(OPTR, &x);
            switch(Precede(x, c))
	    {
                case '<'://栈顶元素优先级低                    
                    Push(&OPTR,c);
                    flag = getNext(&c);
                    break;
                case '='://脱括号并接受下一字符 
                    Pop(&OPTR,&x);
                    flag = getNext(&c);
                    break;
                case '>':// 退栈并将运算结果入栈                                       
                    Pop(&OPTR, &theta);
                    Pop(&OPND,&b);
                    Pop(&OPND,&a);
                    Push(&OPND, Operate(a, theta, b));
                    break;
            }
        }
        GetTop(OPTR, &x);
    }
    GetTop(OPND, &c);
    return c;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值