算术表达式求值的算符优先算法

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>


#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2


typedef int Status;
typedef int Boolean;
typedef int SElemType;



typedef struct SqStack
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

Status InitStack(SqStack *S)
{
    (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!(*S).base)
        return (OVERFLOW);
    (*S).top=(*S).base;
    (*S).stacksize=STACK_INIT_SIZE;
    return OK;
}



Status GetTop(SqStack S,SElemType *e)
{
    if(S.top>S.base)
    {
        *e=*(S.top-1);
        return OK;
    }
    else
        return ERROR;
}

Status Push(SqStack *S,SElemType e)
{
    if((*S).top-(*S).base>=(*S).stacksize)
    {
        (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!(*S).base)
            return(OVERFLOW);
        (*S).top=(*S).base+(*S).stacksize;
        (*S).stacksize+=STACKINCREMENT;
    }
    *((*S).top)++=e;
    return OK;
}

Status Pop(SqStack *S,SElemType *e)
{
    if((*S).top==(*S).base)
        return ERROR;
    *e=*--(*S).top;
    return OK;
}


SElemType Precede(SElemType t1,SElemType t2)
{
    SElemType f;
    switch(t2)
    {
    case '+':
    case '-':if(t1=='('||t1=='=')
                 f='<';
             else
                 f='>';
        break;
    case '*':
    case '/':if(t1=='*'||t1=='/'||t1==')')
                 f='>';
             else
                 f='<';
        break;
    case '(':if(t1==')')
             {
                 printf("ERROR1\n");
                 return(ERROR);
             }
             else
                 f='<';
        break;
    case ')':switch(t1)
             {
    case '(':f='=';
        break;
    case '=':printf("ERROR2\n");
        return(ERROR);
    default: f='>';
             }
             break;
    case '=':switch(t1)
             {
    case '=':f='=';
        break;
    case '(':printf("ERROR2\n");
        return(ERROR);
    default: f='>';
             }
    }
    return f;
}

Status In(SElemType c)
{
    switch(c)
    {
    case'+':
    case'-':
    case'*':
    case'/':
    case'(':
    case')':
    case'=':return TRUE;
    default:return FALSE;
    }
}

SElemType Operate(SElemType a,SElemType theta,SElemType b)
{
    SElemType c;
    switch(theta)
    {
    case'+':c=a+b;
        break;
    case'-':c=a-b;
        break;
    case'*':c=a*b;
        break;
    case'/':c=a/b;
    }
    return c;
}

SElemType Evaluateexpression_r()
{
    SqStack OPTR,OPND;
    SElemType a,b,d,x,theta;
    char c;
    char z[10];
    int i;
    InitStack(&OPTR);
    Push(&OPTR,'=');
    InitStack(&OPND);
    c=getchar();
    GetTop(OPTR,&x);
    while(c!='='||x!='=')
    {
        if(In(c))
            switch(Precede(x,c))
        {
            case'<':Push(&OPTR,c);
                c=getchar();
                break;
            case'=':Pop(&OPTR,&x);
                c=getchar();
                break;
            case'>':Pop(&OPTR,&theta);
                Pop(&OPND,&b);
                Pop(&OPND,&a);
                Push(&OPND,Operate(a,theta,b));
        }
        else if(c>='0'&&c<='9')
        {
            i=0;
            do
            {
                z[i]=c;
                i++;
                c=getchar();
            }while(c>='0'&&c<='9');
            z[i]=0;
            d=atoi(z);
            Push(&OPND,d);
        }
        else
        {
            printf("ERROR3\n");
            return(ERROR);
        }
        GetTop(OPTR,&x);
    }
    GetTop(OPND,&x);
    return x;
}

void main()
{
    printf("请输入算术表达式,负数要用(0-正数)表示,并以=结束\n");
    printf("%d\n",Evaluateexpression_r());
}


  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一道关于算术表达式求值算法流程的问题,需要分析算术表达式的结构,按照不同的算符优先级依次计算并更新结果,直到最终得出表达式的值。一般情况下,可以通过栈来实现算法流程,将数字和符号依次压入栈中,根据优先级依次进行计算,最终得到结果。 ### 回答2: 算符优先算法是一种用于计算算术表达式的方法,其核心思想是通过确定算符优先级来确定表达式中各个部分的计算顺序,从而在遍历算术表达式时逐步计算得出最终结果。 算符优先算法的流程图如下: 1. 初始化,将操作数栈和操作符栈清空,并将“#”号作为第一个操作符压入操作符栈中。 2. 读入表达式中的下一个符号,若符号为操作数,则压入操作数栈中,继续扫描下一个符号;若符号为操作符,则比较该操作符与操作符栈顶符号的优先级,如果该操作符优先级大于栈顶符号,则将该操作符压入操作符栈中,继续扫描下一个符号;否则,从操作数栈中弹出两个操作数,从操作符栈中弹出栈顶操作符,对两个操作数进行相应的计算,并将结果压入操作数栈中,然后继续比较该操作符与新栈顶操作符的优先级;直到该操作符优先级大于新栈顶操作符的优先级或者操作符栈顶为“#”时,将该操作符压入操作符栈中。 3. 当扫描完整个表达式后,如果操作符栈中还有操作符,则一一弹出栈顶操作符,并从操作数栈中弹出两个操作数进行相应的计算,直到操作符栈中只剩下“#”号。 4. 最后操作数栈中剩下的操作数即为表达式的计算结果。 总的来说,算符优先算法的核心就是运用算符优先级规则得到每个操作的顺序,通过不断计算来得出最终结果。它充分利用了栈的特点,简洁高效,是一种非常常用的算法运算方法。 ### 回答3: 算符优先算法是一种计算算术表达式值的方法。该算法基于不同的算符具有不同的优先级,根据优先级运算表达式中的各个部分,并将结果放回表达式中。 以下是画算术表达式求值算符优先算法的流程图: ![算符优先算法流程图](https://i.loli.net/2021/11/02/gkyeKnxNhaFfsG6.png) ① 读入算术表达式,并设置当前位置为表达式的第一个字符。 ② 定义两个栈:运算符栈和操作数栈。 ③ 当前位置指向的字符是数字,则将该数字入操作数栈。 ④ 当前位置指向的字符是左括号,则将该字符入运算符栈。 ⑤ 当前位置指向的字符是右括号,则一直弹出运算符栈中的运算符,直到遇到左括号。将弹出的运算符和操作数栈中的操作数进行运算,并将运算结果压入操作数栈。 ⑥ 当前位置指向的字符是算符号,则判断该运算符的优先级和运算符栈的栈顶元素的优先级。如果该运算符的优先级不高于栈顶元素的优先级,则弹出栈顶的运算符,和操作数栈中的两个操作数进行运算,并将运算结果压入操作数栈;反之,则将该运算符入运算符栈。 ⑦ 当遇到算术表达式的结尾时,运算符栈中可能还剩余运算符。依次弹出这些运算符,并与操作数栈中的操作数进行运算,将运算结果压入操作数栈。 ⑧ 最终,操作数栈中仅剩一个元素,即为算术表达式的值。 以上就是画算术表达式求值算符优先算法的流程图。通过该流程图,我们可以清晰地了解算符优先算法的计算流程和执行过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值