输入后缀表达式(用空格分隔,输入数据都是正整数,运算符只有+ - * / %等5个),输出运算后的结果。测试数据有多组,处理到输入结束。 请使用C语言
时间: 2024-12-23 19:17:33 浏览: 21
在C语言中,计算后缀表达式的算法通常使用堆栈数据结构来完成,这种方法也被称为逆波兰表示法(RPN)求值。后缀表达式不需要使用括号来明确运算顺序,而是通过运算符优先级来确定计算步骤。
以下是一个简单的C语言函数示例,它会读取一行输入的后缀表达式字符串,并逐个处理元素,直到遇到数字或结束:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 函数用于将操作数压入堆栈
void push(int num, int stack[], int *top) {
if (*top < 0) {
printf("Error: Stack overflow\n");
return;
}
stack[++(*top)] = num;
}
// 函数用于从堆栈中弹出并计算两个数之间的运算结果
int pop_and_eval(char op, int stack[], int *top) {
int b = stack[*top--];
int a = stack[*top--];
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // 注意这里假设除数不为零
case '%': return a % b;
default: return -1; // 非法运算符
}
}
// 主函数处理输入的后缀表达式
int main() {
char input[100];
int stack[100], top = -1;
while (fgets(input, sizeof(input), stdin)) {
char* token = strtok(input, " ");
while (token != NULL) {
if (isdigit(*token)) { // 如果是数字,直接压入堆栈
push(strtol(token, NULL, 10), stack, &top);
} else { // 如果是运算符,先弹出堆栈中的操作数进行计算
int result = pop_and_eval(*token, stack, &top);
if (result == -1) {
printf("Invalid operator: %c\n", *token);
break;
}
// 将计算结果再次压回堆栈
push(result, stack, &top);
}
token = strtok(NULL, " ");
}
}
// 最后,堆栈中剩下的就是最终的结果
if (top >= 0) {
printf("Result: %d\n", stack[top]);
} else {
printf("Empty stack\n");
}
return 0;
}
```
这个程序会持续读取用户输入的后缀表达式,直到遇到文件结束标志。每次读取到一个数字或运算符时,它都会按照规则进行处理,最后堆栈顶端的元素即为表达式的计算结果。
阅读全文