题目描述
一道标准的模拟栈的题目,java中的stack、linkedlist都可以被使用,附上我的代码
答案
import java.util.Scanner;
import java.util.Stack;
/**
* @author :Zeeland
* @date :Created in 2021/3/10 17:38
* @version: 1.0$
*/
public class P1449 {
public static void main(String[] args) {
Scanner s =new Scanner(System.in);
while(s.hasNext()){
String str =s.next();//接受数据
char []arr =str.toCharArray();//转换为字符数组
Stack<String> stack =new Stack<>();
int mid;
String k ="";
//遍历字符数组,对里面的成分进行判断
for (int i = 0; i < arr.length; i++) {
switch (arr[i]){
//如果是'.',则把前面的数字入栈
case '.':
if(i > 0) stack.add(k);
k ="";
break;
case '-':
mid =-Integer.parseInt(stack.pop())+Integer.parseInt(stack.pop());
//String转换为int
stack.add(mid+"");
break;
case '+':
mid =Integer.parseInt(stack.pop())+Integer.parseInt(stack.pop());
//String转换为int
stack.add(mid+"");
break;
case '*':
mid =Integer.parseInt(stack.pop())*Integer.parseInt(stack.pop());
//String转换为int
stack.add(mid+"");
break;
case '/':
int a = Integer.parseInt(stack.pop());
int b = Integer.parseInt(stack.pop());
mid = b /a;
//String转换为int
stack.add(mid+"");
break;
//结束判断
case '@':
break;
//如果不是符号的话就说明这个元素是数字,如果是数字则将这些数字拼接起来成为一个数字字符
default://数字
k += String.valueOf(arr[i]);
}
}
//输出结果
System.out.println(stack.peek());
}
}
}
这里的思路是把这串字符串转换为数组进行分析判断,如果碰到’.'的话就将前面的数字入栈,如果碰到符号就进行运算,这是常规的思路,但是在实际coding的时候容易出问题。
比如,我之前的思路是这样子的:arr为字符数组,遍历arr,如果arr[i]==’.’,那么我将arr[i-1]入栈,这样子做实际上没有考虑到入栈的数字是多位数的情况,如果是多位数,你入栈一个数字就会产生错误,运行错误且产生错误的答案,所以细节十分重要。题目给的实例只有个位数,以后在arr是字符数组的时候需要考虑它的位数构成,这在模拟栈的题目中显得极为重要!