题目描述
Emacs号称神的编辑器,它自带了一个计算器。与其他计算器不同,它是基于后缀表达式的,即运算符在操作数的后面。例如“2 3 +”等价于中缀表达式的“2 + 3”。 请你实现一个后缀表达式的计算器。
输入描述
输入包含多组数据。
每组数据包括两行:第一行是一个正整数n (3≤n≤50);紧接着第二行包含n个由数值和运算符组成的列表。
“±*/”分别为加减乘除四则运算,其中除法为整除,即“5/3=1”。
输出描述
对应每一组数据,输出它们的运算结果。
解题思路
关于后缀表达式,我们利用到了栈,我们首先要了解后缀表达式是怎样由中缀表达式变换过来的,比如中缀表达式(2 + 3)* 4的后缀表达式就是2 3 + 4 ,我们给每个运算法附近画上括号,在把运算符移到相应的括号外,最后去掉括号即可,比如((2 + 3) 4)-----> ( ( 2 3 ) + 4 ) * ------> 2 3 + 4 *,此题魔门利用栈,遇到数字入栈,遇到符号出两位计算,再入栈。
代码如下
import java.util.*;
public class Main{
public static int Emacs(StringBuilder sb){
String str = sb.toString();
String[] ret = str.split(" ");
Stack<Integer> stack = new Stack<>();
for(int i = 0;i < ret.length;i++){
if(!ret[i].equals("+")&&!ret[i].equals("-")&&
!ret[i].equals("*")&&!ret[i].equals("/")){
stack.push(Integer.valueOf(ret[i]));
}else{
int m = stack.pop();
int n = stack.pop();
if(ret[i].equals("*")){
stack.push(m * n);
}else if(m != 0&&ret[i].equals("/")){
stack.push(n / m);
}else if(ret[i].equals("-")){
stack.push(n - m);
}else{
stack.push(m + n);
}
}
}
return stack.pop();
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int n = scan.nextInt();
int i = 0;
StringBuilder sb = new StringBuilder();
while(i < n){
sb.append(scan.next());
sb.append(" ");
i++;
}
System.out.println(Emacs(sb));
}
}
}