逆波兰表达式(栈)

逆波兰表达式(栈)
摘要由CSDN通过智能技术生成

目录

Description

Format

Input

Output

Samples

输入数据 1

输出数据 1

Limitation

解题思路:

代码+解析:


Description

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作3 4 - 5 +”:先3减去4,再加上5。

使用逆波兰记法的一个好处是不需要使用括号。

Format

Input

输入一个逆波兰表达式,其中数字不超过 1000 项,各项间用一个空格隔开,保证式子正确,运算符只包括 加+、减-、乘*、除/

Output

输出其运算结果,保留 2 位有效数字。

Samples

输入数据 1

1 2 + 3 * 2 /

输出数据 1

4.50

Limitation

1s, 1024KiB for each test case.

所有浮点数值的绝对值均小于 10^10。

解题思路:</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
逆波兰表达式是一种将运算符放在操作数后面表达式,例如表达式 3 + 4 * 5 可以转换为后缀表达式 3 4 5 * +。实现逆波兰表达式的计算可以使用来实现,具体步骤如下: 1. 创建一个,用于存储操作数间结果。 2. 从左到右遍历逆波兰表达式的每个元素。 3. 如果当前元素是操作数,则将其压入。 4. 如果当前元素是运算符,则从弹出两个操作数,进行运算,并将结果压入。 5. 遍历完整个表达式后,只剩下一个元素,即为表达式的计算结果。 以下是逆波兰表达式实现的 C 代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_SIZE 100 typedef struct { int top; int data[MAX_SIZE]; } Stack; void init(Stack *s) { s->top = -1; } int is_empty(Stack *s) { return s->top == -1; } int is_full(Stack *s) { return s->top == MAX_SIZE - 1; } void push(Stack *s, int x) { if (is_full(s)) { printf("Stack overflow\n"); exit(1); } s->data[++s->top] = x; } int pop(Stack *s) { if (is_empty(s)) { printf("Stack underflow\n"); exit(1); } return s->data[s->top--]; } int calculate(char *expr) { Stack s; init(&s); char *token = strtok(expr, " "); while (token != NULL) { if (isdigit(token[0])) { push(&s, atoi(token)); } else { int b = pop(&s); int 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; default: printf("Invalid operator: %c\n", token[0]); exit(1); } } token = strtok(NULL, " "); } int result = pop(&s); if (!is_empty(&s)) { printf("Invalid expression\n"); exit(1); } return result; } int main() { char expr[] = "3 4 5 * +"; int result = calculate(expr); printf("%d\n", result); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值