【每日算法】AB4 逆波兰表达式求值

简介: AB4 逆波兰表达式求值

题目

描述

给定一个逆波兰表达式,求表达式的值。

数据范围:表达式长度满足 1≤n≤10^4^,表达式中仅包含数字和 + ,- , * , / ,其中数字的大小满足 ∣val∣≤200 。

示例1

输入:["2","1","+","4","*"]
返回值:12

示例2

输入:["2","0","+"]
返回值:2

代码

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param tokens string字符串一维数组
 * @param tokensLen int tokens数组长度
 * @return int整型
 */

#include<string.h>
#include<stdlib.h>

struct stack {
    int size;
    int top;
    int data[10001];
} stack;

void init(struct stack* sk) {
    sk->top = 0;
    sk->size = 0;
}

void push(struct stack* sk, int a) {
    sk->data[sk->top] = a;
    sk->size ++;
    sk->top ++;
}

int top(struct stack* sk) {
    return sk->data[sk->top - 1];
}

int pop(struct stack* sk) {
    sk->size --;
    sk->top --;
    return sk->data[sk->top];
}
int evalRPN(char** tokens, int tokensLen ) {
    struct stack sk;
    init(&sk);
    for (int i = 0; i < tokensLen; i ++) {
        if (strcmp("+", tokens[i]) == 0) {
            printf("+\n");
            int op1 = pop(&sk);
            int op2 = pop(&sk);
            int tmp = op1 + op2;
            printf("stacksize:%d op1:%d op2:%d result:%d\n", sk.size, op1, op2, tmp);
            printf("%d\n", tmp);
            push(&sk, tmp);
        } else if (strcmp("-", tokens[i]) == 0) {
            printf("-\n");
            int op1 = pop(&sk);
            int op2 = pop(&sk);
            int tmp = op2 - op1;
            printf("stacksize:%d op1:%d op2:%d result:%d\n", sk.size, op1, op2, tmp);
            printf("%d\n", tmp);
            push(&sk, tmp);
        } else if (strcmp("*", tokens[i]) == 0) {
            printf("*\n");
            int op1 = pop(&sk);
            int op2 = pop(&sk);
            int tmp = op1 * op2;
            printf("stacksize:%d op1:%d op2:%d result:%d\n", sk.size, op1, op2, tmp);
            printf("%d\n", tmp);
            push(&sk, tmp);
        } else if (strcmp("/", tokens[i]) == 0) {
            printf("/\n");
            int op1 = pop(&sk);
            int op2 = pop(&sk);
            int tmp = op2 / op1;
            printf("stacksize:%d op1:%d op2:%d result:%d\n", sk.size, op1, op2, tmp);
            printf("%d\n", tmp);
            push(&sk, tmp);
        } else {
            printf("%s\n", tokens[i]);
            push(&sk, atoi(tokens[i]));
        }
    }
    return top(&sk);
}

思路

思路很简单,遍历tokens,遇到数字压入栈,遇到运算符让两个数字出栈,再把运算结果入栈就好了。
中途被自己蠢到了,看到tokens中都是char 的,所以想也没想就让栈中保存的数据类型也是char,然后中间就遇到了int和char*数据类型相互转换的问题。这时候才发现存int就好了,哭

复习知识点

  1. char*转int:使用atoi库函数
  2. int转char*:可以使用sprintf

注意:但是字符串得声明成字符数组形式char str[]

目录
相关文章
|
3月前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
222 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
3月前
【LeetCode 25】150.逆波兰表达式求值
【LeetCode 25】150.逆波兰表达式求值
16 0
|
5月前
|
算法
【算法】栈算法——逆波兰表达式求值
【算法】栈算法——逆波兰表达式求值
|
7月前
|
C++
【洛谷 P1739】表达式括号匹配 题解(栈)
该编程题目要求检查给定的包含字母、运算符和括号的表达式是否括号匹配。输入为一行表达式,以`@`结束。如果括号匹配,输出`YES`,否则输出`NO`。样例包括一个匹配和一个不匹配的表达式。解决方案是使用栈,遇到左括号入栈,遇到右括号时判断栈是否为空,栈空则输出`NO`,否则出栈。当读到`@`时,栈空则输出`YES`,否则输出`NO`。提供的AC代码使用C++实现,通过`stack`处理括号匹配。
104 0
|
8月前
|
索引
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
70 0
|
8月前
|
Java C++ Python
acwing 3302. 表达式求值
acwing 3302. 表达式求值
|
8月前
|
Java C++ Python
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
69 0
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
|
8月前
|
Java C++ Python
leetcode-150:逆波兰表达式求值
leetcode-150:逆波兰表达式求值
53 0
|
8月前
|
存储
【例题】逆波兰表达式求值(图解+代码)
【例题】逆波兰表达式求值(图解+代码)
219 0
|
算法
代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值