设计并实现一个表达式求职的大作业。 提交材料:源程序、大作业报告 满分: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];
}
//不能输入小数;不能负数
声明:代码转载,侵权即删。