import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 给定一个后缀表达式,返回它的结果
     * @param str string字符串 
     * @return long长整型
     */
    public long legalExp (String str) {
        // write code here
       String string="";
		Deque<Long> stackDeque=new ArrayDeque<>();
		for (int i = 0; i < str.length(); i++) {
			char c=str.charAt(i);
			if(c-'0'>=0&&c-'0'<=9) {
				string+=c;
			}else if(c=='#') {
				long a=Long.parseLong(string);
				stackDeque.push(a);
				string="";
			}else {
				long a=stackDeque.pop();
				long b=stackDeque.pop();
				if(c=='+') {
					stackDeque.push(a+b);
				}else if(c=='-') {
					stackDeque.push(b-a);
				}else {
					stackDeque.push(a*b);
				}
			}
		}
		return stackDeque.pop();
    }
}

这题卡了我挺久的,首先是如何从字符串获取到数字,我选择根据每一次获取的字符判断,如果是数字,那我就让string接上它,如果是'#'表示输入数字结束了,这个时候我就把string转换为对应的数字,如何压入栈中,如果既不是数字也不是'#',那么就是加减乘了,根据对应的逻辑,完善代码,这里有一点需要注意的是,每一次从栈顶获取元素,先获得的肯定是栈顶元素,也就是后面输入进去的,所以当处理减法时。我们应该让后出栈的减先出栈的,这样才符合题意