后缀表达式 - 栈的使用
一、题目描述:
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
来源:洛谷 www.luogu.com.cn/problem/P14…
输入格式
输入:后缀表达式
3.5.2.-*7.+@
输出格式
输出:表达式的值
16
二、思路分析:
后缀表达式又叫做逆波兰式,根据题目中的案例我们可以了解到它的运算过程就是遇到数字按顺序存起来,遇到运算符就把最近的两个数字拉出来进行运算,然后再把结果存起来,在此过程中我们不考虑运算符的优先级。
我们遇到 . 就把操作数压入栈中, 使用 num = num * 10 + i 将数从字符串中取出来。遇到操作符 + - * / 就从栈中取出运算, 遇到 @ 就可以取出栈中的运算结果了
那么如何取最近存储的两个数字呢,就会用到栈(Stack)了,栈的规则呢就是先进后出,所以题目的解法非常简单,只需要将栈作为存储容器即可。 那么我们复习一下栈的基本操作
- empty(): 测试堆栈是否为空。
- peek(): 查看堆栈顶部的对象,但不从堆栈中移除它。
- pop(): 移除堆栈顶部的对象,并作为此函数的值返回该对象。
- push(): 把项压入堆栈顶部。
- search(): 返回对象在堆栈中的位置,以 1 为基数。
- add(): stack本身没有add()方法,但是继承的类vector有add方法, add()同样可以添加元素
三、AC 代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
// 创建栈
Stack<Integer> r = new Stack<>();
String str = sr.next();
int ch = 0, num = 0;
for (int i = 0; i < str.length(); i++){
if( str.charAt(i) == '@') {
System.out.println(r.pop());
return;
}
// 因为是遍历字符串,如果该字符是数字的话就把那一截是数字的字符串拼起来
if (str.charAt(i) >= '0' && str.charAt(i) <= '9')
num = num * 10 + (str.charAt(i) - '0');
else {
if (str.charAt(i) == '.') {
r.add(num);
// 把数字压入栈中后记得把数字归0
num = 0;
} else {
// 取出栈中最近压入的两个数字
int rear = r.pop();
int front = r.pop();
if (str.charAt(i) == '+') {
ch = front + rear;
}
if (str.charAt(i) == '-') {
ch = front - rear;
}
if (str.charAt(i) == '*') {
ch = front * rear;
}
if (str.charAt(i) == '/') {
ch = front / rear;
}
r.add(ch);
}
}
}
}
}
四、总结:
很简单的一道题目,要记住栈是先进后出, 队列是先进先出~~~
转载自:https://juejin.cn/post/7076265777854644260