逆波兰表达式的代码c语言实现
时间: 2024-03-07 13:50:48 浏览: 200
以下是一个简单的逆波兰表达式求值的代码示例,使用栈来实现,使用C语言编写:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_STACK_SIZE 100
// 定义栈结构体
typedef struct {
double data[MAX_STACK_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack* s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 入栈操作
void push(Stack* s, double x) {
if (!isFull(s)) {
s->top++;
s->data[s->top] = x;
} else {
printf("Error: stack is full.\n");
}
}
// 出栈操作
double pop(Stack* s) {
if (!isEmpty(s)) {
double x = s->data[s->top];
s->top--;
return x;
} else {
printf("Error: stack is empty.\n");
return -1;
}
}
// 逆波兰表达式求值
double evaluate(char* expression) {
Stack s;
initStack(&s);
char* token = strtok(expression, " ");
while (token != NULL) {
if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) {
push(&s, atof(token));
} else {
double b = pop(&s);
double a = pop(&s);
switch (token[0]) {
case '+': push(&s, a + b); break;
case '-': push(&s, a - b); break;
case '*': push(&s, a * b); break;
case '/': push(&s, a / b); break;
}
}
token = strtok(NULL, " ");
}
return pop(&s);
}
int main() {
char expression[] = "5 1 2 + 4 * + 3 -";
double result = evaluate(expression);
printf("Result: %lf\n", result);
return 0;
}
```
该程序首先定义了一个栈结构体,然后实现了栈的常见操作函数。在主函数中,定义了一个逆波兰表达式字符串,然后调用 evaluate 函数来求其值。在 evaluate 函数中,使用 strtok 函数将表达式字符串拆分成一系列标记,然后遍历这些标记。如果标记是数字,则转换为浮点数并入栈。如果标记是操作符,则从栈中弹出两个操作数,执行相应的操作,并将结果压回到栈中。最终,当整个表达式被处理完毕时,栈顶元素就是表达式的求值结果。
阅读全文