写一个逆波兰表达式求值c语言程序要求可输入给定表达式
时间: 2024-03-16 18:45:21 浏览: 131
好的,下面是一个可以输入给定表达式的逆波兰表达式求值的 C 语言程序。程序使用栈来实现求值。
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_STACK_SIZE 100
int stack[MAX_STACK_SIZE];
int top = -1;
int is_operator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
void push(int n) {
if (top >= MAX_STACK_SIZE - 1) {
fprintf(stderr, "Error: Stack overflow\n");
exit(EXIT_FAILURE);
}
stack[++top] = n;
}
int pop() {
if (top < 0) {
fprintf(stderr, "Error: Stack underflow\n");
exit(EXIT_FAILURE);
}
return stack[top--];
}
int evaluate(char *expr) {
int i, op1, op2, result;
char *token, *saveptr;
token = strtok_r(expr, " ", &saveptr);
while (token != NULL) {
if (isdigit(token[0])) {
push(atoi(token));
} else if (is_operator(token[0])) {
op2 = pop();
op1 = pop();
switch (token[0]) {
case '+': push(op1 + op2); break;
case '-': push(op1 - op2); break;
case '*': push(op1 * op2); break;
case '/': push(op1 / op2); break;
}
}
token = strtok_r(NULL, " ", &saveptr);
}
result = pop();
if (top >= 0) {
fprintf(stderr, "Error: Invalid expression\n");
exit(EXIT_FAILURE);
}
return result;
}
int main() {
char expr[MAX_STACK_SIZE];
printf("Enter an expression in Reverse Polish Notation (RPN):\n");
fgets(expr, MAX_STACK_SIZE, stdin);
expr[strcspn(expr, "\n")] = '\0'; // 去掉换行符
int result = evaluate(expr);
printf("Result = %d\n", result);
return 0;
}
```
这个程序可以通过标准输入获取用户输入的逆波兰表达式,并对其进行求值。程序使用了栈来实现逆波兰表达式求值,先遍历逆波兰表达式中的每个字符,若是数字则入栈,若是运算符则弹出栈顶的两个元素进行运算,并将结果入栈。最终,栈中只剩下一个元素,即为表达式的值。注意,在输入表达式时需要注意输入的字符串长度不能超过 MAX_STACK_SIZE,否则可能导致栈溢出。
阅读全文