栈应用之解决表达式计算
Posted 南淮北安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈应用之解决表达式计算相关的知识,希望对你有一定的参考价值。
一、题目
一个表达式只含有:‘0’~‘9’,’+’,‘x’,’@’ 字符
‘+’:加法运算
‘x’:乘法运算
‘@’ :定义a@b=a|(a+b)
运算优先级:@>x>+
二、题解
对于表达式计算,首先考虑栈解决
本题需要两个栈,一个记录数字 deque1,一个记录运算符 deque2
如果当前是数字则入栈 deque1
如果当前是运算符,需要判断下,如果当前栈不为空,
且当前运算符的优先级小于deque2的栈顶运算符的优先级,则deque1出栈两个元素,使用栈顶运算符进行计算
直到当前运算符大于栈顶运算符的优先级
三、代码
import java.util.Deque;
import java.util.LinkedList;
public class Main
public static void main(String[] args)
String str = "1@2@3";
//记录数字
Deque<Integer> deque1 = new LinkedList<>();
//记录运算符
Deque<Character> deque2 = new LinkedList<>();
int start = 0;
while (start < str.length())
String temp = "";
//如果当前字符时数字
while (start < str.length() && str.charAt(start) >= '0' && str.charAt(start) <= '9')
temp += str.charAt(start++);
//如果当前字符时运算符
if ("".equals(temp))
//如果当前运算符的优先级大于栈顶元素的优先级则入栈
if (deque2.isEmpty() || isBig(str.charAt(start), deque2.peek()))
deque2.push(str.charAt(start++));
else
//否则出栈运算,直到当前运算符的优先级大于栈顶元素的优先级
while (!deque2.isEmpty() && !isBig(str.charAt(start), deque2.peek()))
char ch = deque2.pop();
int data1 = deque1.pop();
int data2 = deque1.pop();
//进行计算
int data = getData(data1, data2, ch);
deque1.push(data);
deque2.push(str.charAt(start++));
else
deque1.push(Integer.parseInt(temp));
while (!deque2.isEmpty())
char ch = deque2.pop();
int data1 = deque1.pop();
int data2 = deque1.pop();
int data = getData(data1, data2, ch);
deque1.push(data);
System.out.println(deque1.peek());
private static int getData(int data1, int data2, char ch)
if (ch == '+')
return data1 + data2;
if (ch == 'x')
return data1 * data2;
return data1 | (data1 + data2);
private static boolean isBig(char charAt, char peek)
if (charAt == '@' && peek != '@')
return true;
if (charAt == 'x' && peek == '+')
return true;
return false;
以上是关于栈应用之解决表达式计算的主要内容,如果未能解决你的问题,请参考以下文章