黄金——表达式问题
计算器问题
题目:leetCode227
思路:
-
碰到数字就入栈
-
设置当前的符号,如果当前字符是+直接入栈
-
如果当前是-则已当前数字的相反数入栈
-
乘和除,则取顶栈与当前的数字进行计算在入栈
-
最后将全部结果都出栈加减入栈
解法:
/**
* 计算器计算
* 1.碰到数字就入栈
* 2.设置当前的符号,如果当前字符是+直接入栈
* 3.如果当前是-则已当前数字的相反数入栈
* 4.*和除,则取顶栈与当前的数字进行计算在入栈
* 5.最后将全部结果都出栈加减入栈
* @param s
* @return
*/
public int calculate(String s) {
ArrayDeque<Integer> stack = new ArrayDeque<>();
char perSign = '+';
int num = 0;
int n = s.length();
for (int i = 0; i < n; i++) {
if (Character.isDigit(s.charAt(i))){
num = num*10+s.charAt(i)-'0';
}
if (!Character.isDigit(s.charAt(i))&&s.charAt(i)!=' '||i==n-1){
switch (perSign){
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop()*num);
break;
case '/':
stack.push(stack.pop()/num);
}
//清楚num和重新赋值新的perSign
num = 0;
perSign = s.charAt(i);
}
}
//相加最后的结果
int ans = 0;
while (!stack.isEmpty()){
ans += stack.pop();
}
return ans;
}
逆波兰表达式
题目:leetCode150
思路:
1. 逆波兰式
1. 遇到数字就入栈
1. 遇到符号就取栈的前两元素进行入栈,并将结果入栈
解法:
/**
* 1.逆波兰式
* 2.遇到数字就入栈
* 3.遇到符号就取栈的前两元素进行入栈,并将结果入栈
* @param tokens
* @return
*/
public int evalRPN(String[] tokens) {
ArrayDeque<String> stack = new ArrayDeque<>();
Integer result = 0;
for (String token : tokens) {
if (!Character.isDigit(token.charAt(0))&&token.length()==1){
//说明是符号,
int num1 = Integer.valueOf(stack.pop());
int num2 = Integer.valueOf(stack.pop());
switch (token) {
case "+":
result = num2 + num1;
break;
case "-":
result = num2-num1;
break;
case "*":
result = num2*num1;
break;
case "/":
result= num2/num1;
}
stack.push(result.toString());
}else {
//说明是数字,入栈
stack.push(token);
}
}
return Integer.valueOf(stack.pop());
}