题目
描述
给定一个逆波兰表达式,求表达式的值。
数据范围:表达式长度满足 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就好了,哭
复习知识点
- char*转int:使用atoi库函数
- int转char*:可以使用sprintf
注意:但是字符串得声明成字符数组形式char str[]