用c语言写:逆波兰式也叫后缀表达式(将运算符写在操作数之后) 如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+ ,使用逆波兰式表达式便于使用栈计算值 【输入形式】 一行token,使用空格分开,只有 +-*/ 或数字,以字符#结束 【输出形式】 求出的值 【样例输入】 2 1 + 3 *# 【样例输出】 9
时间: 2024-02-27 08:58:34 浏览: 123
好的,以下是使用C语言实现逆波兰表达式的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 定义栈结构体
typedef struct Stack {
int top;
int data[MAX_SIZE];
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
bool isEmpty(Stack *s) {
return s->top == -1;
}
// 入栈
void push(Stack *s, int x) {
if (s->top == MAX_SIZE - 1) {
printf("Stack Overflow!\n");
exit(1);
}
s->data[++(s->top)] = x;
}
// 出栈
int pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack Underflow!\n");
exit(1);
}
return s->data[(s->top)--];
}
// 计算逆波兰表达式
int evalRPN(char **tokens, int tokensSize) {
Stack s;
init(&s);
int i, x, y;
for (i = 0; i < tokensSize; i++) {
if (strcmp(tokens[i], "+") == 0) {
x = pop(&s);
y = pop(&s);
push(&s, x + y);
} else if (strcmp(tokens[i], "-") == 0) {
x = pop(&s);
y = pop(&s);
push(&s, y - x);
} else if (strcmp(tokens[i], "*") == 0) {
x = pop(&s);
y = pop(&s);
push(&s, x * y);
} else if (strcmp(tokens[i], "/") == 0) {
x = pop(&s);
y = pop(&s);
push(&s, y / x);
} else {
push(&s, atoi(tokens[i]));
}
}
return pop(&s);
}
// 主函数
int main() {
char tokens[MAX_SIZE][MAX_SIZE];
int i, j = 0, k = 0;
char c;
while ((c = getchar()) != '#') {
if (c == ' ') {
tokens[j++][k] = '\0';
k = 0;
} else {
tokens[j][k++] = c;
}
}
tokens[j][k] = '\0';
printf("%d\n", evalRPN(tokens, j + 1));
return 0;
}
```
其中,使用栈来计算逆波兰表达式。代码中使用了一个二维字符数组tokens来存储输入的表达式,通过getchar()函数逐个读入字符,并将其存储在tokens中,直到读入字符'#'为止。然后调用evalRPN()函数计算表达式的值,最后输出结果。evalRPN()函数的实现和之前Python代码的实现是类似的,使用栈来计算表达式的值。
阅读全文