逆波兰符号法的c语言代码
时间: 2023-10-20 15:05:25 浏览: 101
用C语言编写的逆波兰程序
逆波兰符号法也称为后缀表达式,它是一种用于数学表达式的计算方法。下面是使用栈实现逆波兰符号法的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
typedef struct {
int top;
int stack[MAX_STACK_SIZE];
} Stack;
void push(Stack *s, int value) {
if (s->top < MAX_STACK_SIZE) {
s->stack[s->top++] = value;
} else {
printf("Stack overflow!\n");
exit(1);
}
}
int pop(Stack *s) {
if (s->top > 0) {
return s->stack[--s->top];
} else {
printf("Stack underflow!\n");
exit(1);
}
}
int is_operator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
int calculate(int op1, int op2, char operator) {
switch (operator) {
case '+':
return op1 + op2;
case '-':
return op1 - op2;
case '*':
return op1 * op2;
case '/':
return op1 / op2;
default:
printf("Invalid operator: %c\n", operator);
exit(1);
}
}
int evaluate(char *expression) {
Stack s;
s.top = 0;
int i = 0;
while (expression[i] != '\0') {
if (isdigit(expression[i])) {
push(&s, expression[i] - '0');
} else if (is_operator(expression[i])) {
int op2 = pop(&s);
int op1 = pop(&s);
int result = calculate(op1, op2, expression[i]);
push(&s, result);
} else {
printf("Invalid character: %c\n", expression[i]);
exit(1);
}
i++;
}
if (s.top != 1) {
printf("Invalid expression!\n");
exit(1);
}
return pop(&s);
}
int main() {
char expression[] = "23+45+*";
int result = evaluate(expression);
printf("Result: %d\n", result);
return 0;
}
```
在这个代码中,我们定义了一个栈结构体,其中包含一个整型数组和一个栈顶指针。我们通过 `push` 和 `pop` 函数来实现栈的入栈和出栈操作。`is_operator` 函数用于判断一个字符是否为运算符,`calculate` 函数用于计算两个操作数和一个运算符的结果。`evaluate` 函数是实现逆波兰符号法的核心,它遍历表达式中的每个字符,如果是数字则入栈,如果是运算符则弹出栈顶的两个操作数进行计算,并将结果入栈。最后,我们通过 `pop` 函数取出栈顶的结果作为表达式的计算结果。在 `main` 函数中,我们定义了一个逆波兰表达式,并调用 `evaluate` 函数计算结果。
阅读全文