1、使用栈
使用栈数据结构是计算逆波兰表达式的经典方法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
// 判断是否为运算符
int isOperator(char *token) {
return (strcmp(token, "+") == 0 ||
strcmp(token, "-") == 0 ||
strcmp(token, "*") == 0 ||
strcmp(token, "/") == 0);
}
// 执行运算
int performOperation(int a, int b, char *operator) {
if (strcmp(operator, "+") == 0) return a + b;
if (strcmp(operator, "-") == 0) return a - b;
if (strcmp(operator, "*") == 0) return a * b;
if (strcmp(operator, "/") == 0) return a / b;
return 0; // 不会执行到这里
}
// 计算逆波兰表达式的函数
int evaluateRPN(char **tokens, int tokensSize) {
int stack[MAX_STACK_SIZE];
int top = -1;
for (int i = 0; i < tokensSize; i++) {
if (isOperator(tokens[i])) {
int b = stack[top--];
int a = stack[top--];
int result = performOperation(a, b, tokens[i]);
stack[++top] = result;
} else {
stack[++top] = atoi(tokens[i]);
}
}
return stack[top];
}
int main() {
char *tokens1[] = {"2", "1", "+", "3", "*"};
int size1 = sizeof(tokens1) / sizeof(tokens1[0]);
printf("Result: %d\n", evaluateRPN(tokens1, size1)); // 输出: 9
char *tokens2[] = {"4", "13", "5", "/", "+"};
int size2 = sizeof(tokens2) / sizeof(tokens2[0]);
printf("Result: %d\n", evaluateRPN(tokens2, size2)); // 输出: 6
return 0;
}
2、递归方法
使用递归方法可以简化部分逻辑,但需要更多的内存和栈深度。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 判断是否为运算符
int isOperator(char *token) {
return (strcmp(token, "+") == 0 ||
strcmp(token, "-") == 0 ||
strcmp(token, "*") == 0 ||
strcmp(token, "/") == 0);
}
// 执行运算
int performOperation(int a, int b, char *operator) {
if (strcmp(operator, "+") == 0) return a + b;
if (strcmp(operator, "-") == 0) return a - b;
if (strcmp(operator, "*") == 0) return a * b;
if (strcmp(operator, "/") == 0) return a / b;
return 0; // 不会执行到这里
}
// 递归计算逆波兰表达式
int evaluateRPNRecursively(char **tokens, int *index) {
char *token = tokens[(*index)--];
if (!isOperator(token)) {
return atoi(token);
} else {
int b = evaluateRPNRecursively(tokens, index);
int a = evaluateRPNRecursively(tokens, index);
return performOperation(a, b, token);
}
}
int evaluateRPN(char **tokens, int tokensSize) {
int index = tokensSize - 1;
return evaluateRPNRecursively(tokens, &index);
}
int main() {
char *tokens1[] = {"2", "1", "+", "3", "*"};
int size1 = sizeof(tokens1) / sizeof(tokens1[0]);
printf("Result: %d\n", evaluateRPN(tokens1, size1)); // 输出: 9
char *tokens2[] = {"4", "13", "5", "/", "+"};
int size2 = sizeof(tokens2) / sizeof(tokens2[0]);
printf("Result: %d\n", evaluateRPN(tokens2, size2)); // 输出: 6
return 0;
}
3、手动模拟栈操作
手动模拟栈操作可以实现更低层次的控制,但代码较复杂。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
// 判断是否为运算符
int isOperator(char *token) {
return (strcmp(token, "+") == 0 ||
strcmp(token, "-") == 0 ||
strcmp(token, "*") == 0 ||
strcmp(token, "/") == 0);
}
// 执行运算
int performOperation(int a, int b, char *operator) {
if (strcmp(operator, "+") == 0) return a + b;
if (strcmp(operator, "-") == 0) return a - b;
if (strcmp(operator, "*") == 0) return a * b;
if (strcmp(operator, "/") == 0) return a / b;
return 0; // 不会执行到这里
}
// 手动模拟栈操作
int evaluateRPN(char **tokens, int tokensSize) {
int stack[MAX_STACK_SIZE];
int top = -1;
for (int i = 0; i < tokensSize; i++) {
if (isOperator(tokens[i])) {
if (top < 1) {
fprintf(stderr, "Error: Insufficient values in the expression\n");
exit(EXIT_FAILURE);
}
int b = stack[top--];
int a = stack[top--];
int result = performOperation(a, b, tokens[i]);
stack[++top] = result;
} else {
char *endptr;
long val = strtol(tokens[i], &endptr, 10);
if (*endptr != '\0') {
fprintf(stderr, "Error: Invalid number %s\n", tokens[i]);
exit(EXIT_FAILURE);
}
stack[++top] = val;
}
}
if (top != 0) {
fprintf(stderr, "Error: The expression does not evaluate to a single result\n");
exit(EXIT_FAILURE);
}
return stack[top];
}
int main() {
char *tokens1[] = {"2", "1", "+", "3", "*"};
int size1 = sizeof(tokens1) / sizeof(tokens1[0]);
printf("Result: %d\n", evaluateRPN(tokens1, size1)); // 输出: 9
char *tokens2[] = {"4", "13", "5", "/", "+"};
int size2 = sizeof(tokens2) / sizeof(tokens2[0]);
printf("Result: %d\n", evaluateRPN(tokens2, size2)); // 输出: 6
return 0;
}