题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
输入输出样例
输入 #1
3.5.2.-*7.+@
输出 #1
16
刚好看过这个算法的视频,底气就是不一样, 两次过
思路:
开辟一个栈,用来存放数据,遇到符号则取出来(注意取的顺序谁先谁后)。
如果都是一位数的话,那就很简单了,可是有的不止一位数,所以我们就得考虑,怎么样才能把多位数从字符串里面取出来压栈。
提示:
Integer.parseInt()–》字符串变整数。
str.substring(Start,end);–》截取字符串中 [Start,end)的字符,!左闭右开!
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> shu = new Stack<>();
//存放数字的栈
Scanner input = new Scanner(System.in);
String str = input.next();
int num1 = 0, num2 = 0,num = 0,k=0,flag=0;
for (int i = 0; i<str.length();i++){
if (str.charAt(i)=='@'){
break;
}else if ('0' <=str.charAt(i) && str.charAt(i) <= '9'||str.charAt(i)=='.'){
//判断是否为数字或者为断点
if (flag == 0){
//遇到第一个数字,则记住他的下标,并把flag设1,让k不动。
k = i;
flag = 1;
continue;
}else if (str.charAt(i) == '.'){
//遇到断点的话,则把k到当前i-1的数字字符取出来。压栈,并把k和flag置0,以便下个数字的截取。
num = Integer.parseInt(str.substring(k,i));
shu.push(num);
k = 0;
flag = 0;
continue;
}
}else{
//出栈,出栈顺序要注意谁先谁后
num2 = shu.pop();
num1 = shu.pop();
switch (str.charAt(i)){
case '+':
num = num1+num2;
break;
case '-':
num = num1 - num2;
break;
case '*':
num = num1*num2;
break;
case '/':
num = num1 / num2;
break;
}
// 把计算后的数压栈
shu.push(num);
}
}
//输出栈内最后的一个数,该数就是该后缀表达式的结果
System.out.println(shu.pop());
input.close();
}
}