算术表达式求值

设计一个程序,演示用运算符优先法对算术表达式求值的过程。

算法:

①表达式过程包含了操作数、运算符和表达式结束符"#",给每种运算符赋予一个优先数,然后设立两个栈:一个运算符栈(OPTR),一个操作数栈(OPND),分别存放运算符和操作数

②对表达式从左往右进行扫描,遇到操作数进OPND栈。遇到运算符,则比较它与OPTR栈的栈顶元素的优先数,若它的优先数更大,则将它压入栈中;否则弹出栈顶的运算符a,并从OPND栈连续弹出两个栈顶元素y和x,进行运算xay,并将结果压入OPND栈。

③在表达式左边也虚设一个"#",使得其在OPTR栈底,一旦左边的"#"与右边的"#"相遇,则表示表达式求值的结束。

 #include<stdio.h>
#include<string.h>
#include<malloc.h>
#define maxsize 10
typedef struct
{
    char elem[maxsize];    
    int top;  //top表示栈顶元素的下一个空位置 
}sqstacktp;
void InitStack(sqstacktp *s)  //初始化栈 
{
    s->top=0;
}
void Push(sqstacktp *s,char ch)  //入栈 
{
    s->elem[s->top]=ch;
    s->top++;

char Pop(sqstacktp *s)  //弹出栈顶运算符
{
    s->top--;
    return s->elem[s->top];
}
int precedence(char ch)  //求运算符优先数
{
    int z=0;
    switch(ch)
    {
        case '+':z=1;break;
        case '-':z=1;break;
        case '*':z=2;break;
        case '/':z=2;break;
        case '(':z=3;break;
        case ')':z=4;break;
        case '#':z=0;break;
        default:printf("error1!\n");  //输入其他字符,则显示error!    
    }    
    return z;  //此z即是运算符优先数 

int operate(int x,char ch,int y)  //进行二元运算
{
    int z=0;
    switch(ch)
    {
        case '+':z=x+y;break;
        case '-':z=x-y;break;
        case '*':z=x*y;break;
        case '/':z=x/y;break;
        default:printf("error2!\n");    
    } 
    return z;  //此z即是每一次的运算结果 
}
int exp_reduced()  //算术表达式求值的运算符优先数算法 
{
    char ch,theta,op[8];
    sqstacktp *OPTR,*OPND;
    OPTR=(sqstacktp*)malloc(sizeof(sqstacktp));
    OPND=(sqstacktp*)malloc(sizeof(sqstacktp));
    char x,y; 
    int result;
    strcpy(op,"+-*/#)(");  //op为运算符的集合,strcpy把字符串复制给op 
    InitStack(OPTR);  //初始化运算符栈OPTR
    Push(OPTR,'#');  //栈初始化,并在运算符栈OPTR的栈底压入表达式左边虚设的字符“#” 
    InitStack(OPND);  //初始化操作数栈OPND
    scanf("%c",&ch);  //从终端读入一个字符 
    while(ch!='#'||OPTR->elem[OPTR->top-1]!='#')  //运算结束条件是:ch=='#'&&OPTR->elem[OPTR->top-1]=='#'
    {
        if(!strchr(op,ch))  //判定ch是不是运算符,不是则执行以下操作 
        {
            Push(OPND,ch);  /不是运算符,则压入操作数栈 
            ch=getchar();  //继续从终端读入下一个字符 
        }
        else if(precedence(ch)>precedence(OPTR->elem[OPTR->top-1])&&precedence(ch)!=4)  //比较优先数
        {
            Push(OPTR,ch);  /的优先数大于栈顶运算符优先数,则将ch压入栈中
            ch=getchar();  //继续从终端读入下一个字符 
        }
        else if(precedence(ch)<precedence(OPTR->elem[OPTR->top-1])&&precedence(OPTR->elem[OPTR->top-1])==3) 
        //若ch为运算符,且小于OPTR栈顶的运算符优先数,但OPTR栈顶的运算符为"(",则将ch压入栈中
        {
            Push(OPTR,ch);    
            ch=getchar();
        } 
        else if(precedence(ch)==4)  //若ch为运算符")" 
        { 
            theta=Pop(OPTR);  //弹出栈顶运算符
            Pop(OPTR);  //抛出运算符优先数为3的"(" 
            y=Pop(OPND);x=Pop(OPND);  //连续弹出两个操作数
            result=operate(x-'0',theta,y-'0');  //进行x和y的运算
            Push(OPND,result+'0');  //将运算结果压入操作数栈
           ch=getchar();
        }
        else  //若ch为运算符,且小于等于OPTR栈顶的运算符优先数,则取出两个栈顶的操作数进行运算 
        { 
            theta=Pop(OPTR);  //弹出栈顶运算符
            y=Pop(OPND);x=Pop(OPND);  //连续弹出两个操作数
            result=operate(x-'0',theta,y-'0');  //进行x和y的运算
            Push(OPND,result+'0');  //将运算结果压入操作数栈    
        } 
    } 
    return OPND->elem[OPND->top-1]-'0';  //从操作数栈顶取出表达式运算结果返回
}
int main()
{
    int result;
    printf("请输入算术表达式(以符号#结束):\n");
    result=exp_reduced();
    printf("结果是:\n%d\n",result);
    return 0;    
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2k546L5bid55qHNQ==,size_20,color_FFFFFF,t_70,g_se,x_16 

 注意:输入算术表达式时括号需用英文的括号。

 

 

以下是使用算符优先法对算术表达式求值C语言程序示例: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_STACK_SIZE 100 typedef struct { int top; char data[MAX_STACK_SIZE]; } Stack; void initStack(Stack *stack) { stack->top = -1; } void push(Stack *stack, char c) { if (stack->top >= MAX_STACK_SIZE - 1) { printf("Stack overflow!\n"); exit(1); } stack->data[++stack->top] = c; } char pop(Stack *stack) { if (stack->top < 0) { printf("Stack underflow!\n"); exit(1); } return stack->data[stack->top--]; } int isEmpty(Stack *stack) { return stack->top < 0; } char stackTop(Stack *stack) { if (stack->top < 0) { printf("Stack underflow!\n"); exit(1); } return stack->data[stack->top]; } int getPriority(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } int evaluate(char *expr) { Stack opStack; initStack(&opStack); Stack valStack; initStack(&valStack); while (*expr != '\0') { if (isdigit(*expr)) { int val = 0; while (isdigit(*expr)) { val = val * 10 + (*expr - '0'); expr++; } push(&valStack, val); } else if (*expr == '(') { push(&opStack, *expr); expr++; } else if (*expr == ')') { while (stackTop(&opStack) != '(') { char op = pop(&opStack); int val2 = pop(&valStack); int val1 = pop(&valStack); int result = 0; switch (op) { case '+': result = val1 + val2; break; case '-': result = val1 - val2; break; case '*': result = val1 * val2; break; case '/': result = val1 / val2; break; } push(&valStack, result); } pop(&opStack); // Pop the left parenthesis expr++; } else if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '/') { while (!isEmpty(&opStack) && getPriority(stackTop(&opStack)) >= getPriority(*expr)) { char op = pop(&opStack); int val2 = pop(&valStack); int val1 = pop(&valStack); int result = 0; switch (op) { case '+': result = val1 + val2; break; case '-': result = val1 - val2; break; case '*': result = val1 * val2; break; case '/': result = val1 / val2; break; } push(&valStack, result); } push(&opStack, *expr); expr++; } else { printf("Invalid character %c!\n", *expr); exit(1); } } while (!isEmpty(&opStack)) { char op = pop(&opStack); int val2 = pop(&valStack); int val1 = pop(&valStack); int result = 0; switch (op) { case '+': result = val1 + val2; break; case '-': result = val1 - val2; break; case '*': result = val1 * val2; break; case '/': result = val1 / val2; break; } push(&valStack, result); } return pop(&valStack); } int main() { char expr[100]; printf("Enter an arithmetic expression: "); scanf("%s", expr); int result = evaluate(expr); printf("Result: %d\n", result); return 0; } ``` 该程序定义了一个栈结构体,实现了栈的基本操作(初始化、入栈、出栈、判断栈是否为空、获取栈顶元素)。还定义了一个getPriority()函数,用于获取操作符的优先级。evaluate()函数是主要实现算符优先法求值的函数,它先将中缀表达式转换为后缀表达式,然后用后缀表达式求值。在evaluate()函数中,用两个栈分别存储操作符和操作数,并根据操作符的优先级来决定入栈还是出栈。最后,将结果从操作数栈中弹出即为表达式的值。程序还实现了对非法字符的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤王帝皇5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值