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

118 阅读2分钟

题目

描述

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

数据范围:表达式长度满足 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[]