用代码实现:逆波兰式也叫后缀表达式(将运算符写在操作数之后) 如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+ ,使用逆波兰式表达式便于使用栈计算值
时间: 2024-02-27 17:58:29 浏览: 93
好的,以下是Python实现逆波兰表达式的代码:
```python
def evalRPN(tokens: List[str]) -> int:
stack = []
for token in tokens:
if token not in ["+", "-", "*", "/"]:
stack.append(int(token))
else:
b, a = stack.pop(), stack.pop()
if token == "+":
stack.append(a + b)
elif token == "-":
stack.append(a - b)
elif token == "*":
stack.append(a * b)
else:
stack.append(int(a / b))
return stack.pop()
```
其中,tokens是一个字符串列表,表示逆波兰表达式,函数返回表达式的计算结果。代码中使用栈来计算表达式的值,对于每个运算符,将栈顶的两个数出栈并进行相应的运算,再将结果入栈。对于操作数,直接入栈即可。最后栈中剩下的一个数就是表达式的计算结果。
相关问题
用c语言写:逆波兰式也叫后缀表达式(将运算符写在操作数之后) 如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+ ,使用逆波兰式表达式便于使用栈计算值 【输入形式】 一行token,使用空格分开,只有 +-*/ 或数字,以字符#结束 【输出形式】 求出的值 【样例输入】 2 1 + 3 *# 【样例输出】 9
好的,以下是使用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代码的实现是类似的,使用栈来计算表达式的值。
输入一个逆波兰式 ,又称后缀表达式(将运算符写在操作数之后)计算出它的值。保证数据合法,不会出现除0的情况,输入的数字都是整数 输入 一个逆波兰式 输出 值 计算结果保留2位小数 样例输入复制 1 2 + 3 4 + * 样例输出复制 21.00,请你用c++帮我完成这个代码
好的,请查看以下代码,实现了逆波兰式的求值:
```c++
#include <iostream>
#include <stack>
#include <string>
#include <iomanip>
using namespace std;
double compute(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: return 0;
}
}
double evaluate(string expr) {
stack<double> s;
for (int i = 0; i < expr.length(); i++) {
if (isdigit(expr[i])) {
double num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
s.push(num);
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
double b = s.top();
s.pop();
double a = s.top();
s.pop();
double c = compute(a, b, expr[i]);
s.push(c);
}
}
return s.top();
}
int main() {
string expr;
getline(cin, expr);
double result = evaluate(expr);
cout << fixed << setprecision(2) << result << endl;
return 0;
}
```
输入的逆波兰式可以使用 `getline` 函数来获取。首先遍历逆波兰式的每个字符,如果是数字则将其加入栈中,如果是运算符则从栈中弹出两个数进行计算,并将计算结果入栈,最后计算完成后栈中只剩下一个数,即为逆波兰式的值。最后输出结果时,需要使用 `fixed` 和 `setprecision` 函数来控制小数位数。
阅读全文