基本计算器-后缀表达式
本文最后更新于:2024年2月12日 晚上
表达式值计算
通用解法:将中缀表达式转换为后缀表达式
- 1.遇到数字,直接存入后缀
- 2.遇到
(
,入栈 - 3.遇到
)
,不断弹出栈顶元素,直到遇到(
- 4.遇到其他运算符,不断弹出优先级大于等于当前运算符的的元素,最后将当前运算符入栈。
*,/
优先级大于+,-
- 5.最后弹出栈中元素,直到栈空
public List<String> getPostfix(String s) {
s = s.trim();
if (s.charAt(0) == '-') s = "0" + s;
List<String> ans = new ArrayList<>();
Deque<Character> q = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') continue;
if (s.charAt(i) == '(') {
q.offerLast(s.charAt(i));
if (s.charAt(i + 1) == '-') ans.add("0");
} else if (s.charAt(i) == ')') {
while (!q.isEmpty() && q.peekLast() != '(') {
ans.add("" + q.pollLast());
}
q.pollLast();
} else if (s.charAt(i) == '+' || s.charAt(i) == '-') {
while (!q.isEmpty() && q.peekLast() != '(') {
ans.add("" + q.pollLast());
}
q.offerLast(s.charAt(i));
} else if (s.charAt(i) == '*' || s.charAt(i) == '/') {
while (!q.isEmpty() && (q.peekLast() == '*' || q.peekLast() == '/')) {
ans.add("" + q.pollLast());
}
q.offerLast(s.charAt(i));
} else {
int l = i;
while (i < s.length() && Character.isDigit(s.charAt(i))) {
i++;
}
ans.add(s.substring(l, i--));
}
}
while (!q.isEmpty()) {
ans.add("" + q.pollLast());
}
return ans;
}
本文作者: MerickBao
本文链接: https://merickbao.top/post/%E7%AE%97%E6%B3%95/%E6%95%B0%E5%AD%A6%E7%9F%A5%E8%AF%86/%E5%9F%BA%E6%9C%AC%E8%AE%A1%E7%AE%97%E5%99%A8.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!