C语言:中缀表达式计算结果
时间: 2023-06-22 22:30:59 浏览: 63
中缀表达式计算结果需要先将中缀表达式转换为后缀表达式,然后再对后缀表达式进行计算。下面是一个简单的C语言程序实现中缀表达式计算结果的过程:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 //定义栈的最大容量
//定义操作符栈
char op_stack[MAX_SIZE];
int top_op = -1;
//定义数字栈
int num_stack[MAX_SIZE];
int top_num = -1;
//获取操作符优先级
int get_priority(char op){
if(op == '*' || op == '/')
return 2;
else if(op == '+' || op == '-')
return 1;
else
return 0;
}
//将中缀表达式转换为后缀表达式
void infix_to_postfix(char *infix, char *postfix){
int i = 0, j = 0;
while(infix[i] != '\0'){
if(infix[i] >= '0' && infix[i] <= '9'){ //如果是数字,直接输出到后缀表达式中
postfix[j++] = infix[i++];
while(infix[i] >= '0' && infix[i] <= '9') //处理多位数字
postfix[j++] = infix[i++];
postfix[j++] = ' '; //数字之间用空格隔开
}
else{ //如果是操作符
if(infix[i] == '('){ //左括号直接入栈
op_stack[++top_op] = infix[i++];
}
else if(infix[i] == ')'){ //右括号将栈中操作符输出到后缀表达式中,直到遇到左括号
while(op_stack[top_op] != '('){
postfix[j++] = op_stack[top_op--];
postfix[j++] = ' '; //操作符之间用空格隔开
}
top_op--; //弹出左括号
i++;
}
else{ //其他操作符
if(top_op == -1 || op_stack[top_op] == '('){ //栈为空或栈顶是左括号,直接入栈
op_stack[++top_op] = infix[i++];
}
else if(get_priority(infix[i]) > get_priority(op_stack[top_op])){ //当前操作符优先级高于栈顶操作符,直接入栈
op_stack[++top_op] = infix[i++];
}
else{ //当前操作符优先级低于等于栈顶操作符,将栈中操作符输出到后缀表达式中,直到栈顶操作符优先级低于当前操作符
while(top_op != -1 && op_stack[top_op] != '(' && get_priority(infix[i]) <= get_priority(op_stack[top_op])){
postfix[j++] = op_stack[top_op--];
postfix[j++] = ' '; //操作符之间用空格隔开
}
op_stack[++top_op] = infix[i++]; //将当前操作符入栈
}
}
}
}
while(top_op != -1){ //将栈中剩余操作符输出到后缀表达式中
postfix[j++] = op_stack[top_op--];
postfix[j++] = ' '; //操作符之间用空格隔开
}
postfix[j] = '\0'; //后缀表达式以'\0'结尾
}
//计算后缀表达式的值
int calculate(char *postfix){
int i = 0;
char num_str[MAX_SIZE]; //用于处理多位数字
int num, num1, num2;
while(postfix[i] != '\0'){
if(postfix[i] >= '0' && postfix[i] <= '9'){ //如果是数字,将其转换为整数
int j = 0;
while(postfix[i] >= '0' && postfix[i] <= '9'){
num_str[j++] = postfix[i++];
}
num_str[j] = '\0';
num = atoi(num_str);
num_stack[++top_num] = num; //将数字入栈
}
else if(postfix[i] == ' '){ //遇到空格,跳过
i++;
}
else{ //如果是操作符,从数字栈中弹出两个数进行计算
num2 = num_stack[top_num--];
num1 = num_stack[top_num--];
switch(postfix[i]){
case '+': num = num1 + num2; break;
case '-': num = num1 - num2; break;
case '*': num = num1 * num2; break;
case '/': num = num1 / num2; break;
}
num_stack[++top_num] = num; //将计算结果入栈
i++;
}
}
return num_stack[top_num]; //返回最终计算结果
}
int main(){
char infix[MAX_SIZE];
char postfix[MAX_SIZE];
int result;
printf("请输入中缀表达式:");
scanf("%s", infix);
infix_to_postfix(infix, postfix);
printf("后缀表达式为:%s\n", postfix);
result = calculate(postfix);
printf("计算结果为:%d\n", result);
return 0;
}
```
注意,上述代码中只考虑了整数的情况,如果表达式中包含小数或负数,需要对代码进行相应的修改。