8-1 表达式求值大作业 (25 分)(C语言版)

设计并实现一个表达式求职的大作业。 提交材料:源程序、大作业报告 满分:25分 评分依据:程序运行结果(15分)、大作业报告(10分) 根据程序运行结果,满分15分,分四个等级。实现一位数的后缀表达式求值(10分)、多位(包括小数)后缀表达式(12分)、一般的中缀表达式求值(包括+、-、、/、())(13分)、任意多位中缀表达式求值(包括+、-、、/、()、负数、除数为0)(15分)。中缀直接求值,还是先转后缀再求值,由学生自己设计,等级没区别。 大作业报告,满分10分,其中分析设计(3分),算法设计(3分),程序运行结果(2分),大作业总结(2分)

注意:
评分的时候,要严格按照评分标准。如果评分有出入,将会扣除你自己的分数。

#include<stdio.h>
#include<stdlib.h>
#define N 1000//规定表达式的长度不超过1000 
int level(char a, char b);//判断两个操作符的优先级:若b的优先级高于a,则返回1;否则返回0 
void infix_to_suffix(char* infix, char* suffix);//将中缀表达式infix转化成后缀表达式suffix 
int suffix_value(char* suffix);//计算后缀表达式,返回运算结果 
int main() {
    char infix[N], suffix[N];//infix中缀表达式,suffix后缀表达式
    
	gets(infix);
    infix_to_suffix(infix, suffix);
    printf("后缀表达式:%s\n",suffix);
    printf("结果:%d\n", suffix_value(suffix));
    return 0;
}



int level(char a, char b) {
    if(b == '(')
        return 1;//左括号直接入栈
    else if((b == '*' || b == '/') &&(a == '+' || a == '-' || a == '('))
        return 1;//*、/优先级高于+、-、(,入栈
    else if((b == '+' || b == '-') && (a == '('))
        return 1;//注意:在括号中+、-优先级高于(,入栈
    else
        return 0;
}



/*中缀表达式转后缀表达式:
  中缀表达式之间无分割, 
  后缀表达式操作数、操作符之间要用空格分割,以便于区分不同的操作数*/
void infix_to_suffix(char* infix, char* suffix) {
    int i, k, j=0, top=0;
    char stack[N];//存储运算符的栈

    for(i=0; infix[i]!='\0'; i++) {
        if(infix[i] >= '0' && infix[i] <= '9') {
            suffix[j++] = infix[i];//操作数则直接输出
        } else {
            if(i != 0 && infix[i-1] >= '0' && infix[i-1] <= '9') { 
                suffix[j++] = ' ';//操作数后补充空格分割
            }
            if(infix[i] == ')') {
                while(stack[top-1] != '(') {
                    suffix[j++] = stack[--top];//遇到右括号则一直弹出直到左括号,但左括号不输出
                    suffix[j++] = ' ';//操作符后补充空格分割 
                }
                top--;//左括号弹出,但不输出到suffix 
            } else if(top == 0 || level(stack[top-1], infix[i])) {
                stack[top++] = infix[i];//栈为空或当前操作符的优先级高于栈顶操作符,当前操作符入栈
            } else {
                while(!level(stack[top-1], infix[i])) {
                    suffix[j++] = stack[--top];//当前操作符优先级等于或低于栈顶操作符则弹出栈顶
                    suffix[j++] = ' ';
                    if(top == 0)
                        break;
                }
                stack[top++] = infix[i];//当前操作符入栈
            }
        }
    }
    
    if(suffix[j-1] != ' ') {
        suffix[j++] = ' ';//补充空格进行分割 
    }
    
    while(top != 0) {//如果操作符栈不为空,弹出所有操作符
        suffix[j++] = stack[--top];
        suffix[j++] = ' ';//操作符之间用空格分割 
    }
    suffix[j] = '\0';
}

/*后缀表达式求值*/
int suffix_value(char* suffix) {
    int i, j;
    char op;
    int stack[N];
    int top = 0, value = 0;
    
    for(i=0; suffix[i] != '\0'; i++) {
        if(suffix[i] >= '0' && suffix[i] <= '9') {
            value = value*10 + suffix[i] - '0';
        } else if(suffix[i] == ' ') {
            stack[top++] = value;//操作数入栈
            value = 0;
        } else {
            //根据操作符,对栈顶两个操作数进行计算并得到结果
            switch(suffix[i]) {
                case '+': value = stack[top-2] + stack[top-1];break;
                case '-': value = stack[top-2] - stack[top-1];break;
                case '*': value = stack[top-2] * stack[top-1];break;
                case '/': 
                if(stack[top-1]==0){
                	printf("除数不能为0!\n");exit(0); 
				}else{
					value = stack[top-2] / stack[top-1];break;
				}
                default: {
                	printf("暂不支持某些操作!\n");
					exit(0); 
				}
            }
            top -= 2;
        }
    }

    return stack[0];
}
//不能输入小数;不能负数 

声明:代码转载,侵权即删。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值