Stack的一个典型应用就是计算数字表达式,如9 + (3 - 1) * 3 + 10 / 2,计算机将中缀表达式转为后缀表达式,再对后缀表达式进行计算,过程如下:
数字直接输出;
栈为空时,遇到运算符,直接入栈;
遇到左括号,将其入栈;
遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
遇到运算符(加减乘除),弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;
最终将栈中的元素依次出栈,输出。
则以上输出答案为:9 3 1 - 3 * + 10 2 / +(后缀表达式)
计算后缀表达式:
遇到数字时,将数字压入堆栈;
遇到运算符时,弹出当前栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;
重复上述过程直到表达式最右端;
运算得出的值即为表达式的结果。
public class Test {
public static void main(String[] args) {
String s1 = "9 + ( 3 - 1 ) * 3 + 10 / 2";
String s2 = "10 + 50 / 2 - 32 * 2 * 3 + 2 * 2";
System.out.println(parseExpression(s1));
System.out.println(parseExpression(s2));
}
public static int parseExpression(String s) {
int res = 0;// 最终结果
String[] strs = s.split(" ");// 按空格分割数字和运算符
Stack stack = new Stack();
List<String> list = new ArrayList<String>();// 统计后缀表达式
for(int i=0; i<strs.length; i++) {
String tmp = strs[i];
if(StringUtil.IsNum(tmp)) {// 数字
stack.push(tmp);
} else if("+".equals(tmp) || "-".equals(tmp) || "*".equals(tmp) || "/".equals(tmp)) {// 运算符
if(stack.size() == 0) {
stack.push(tmp);
} else {
if("*".equals(tmp) || "/".equals(tmp)) {
while(true) {
if(stack.isEmpty()){
break;
}
String tmp2 = (String) stack.peek();
if(tmp2.equals("+") || tmp2.equals("-") || tmp2.equals("(")) {
break;
}
tmp2 = (String) stack.pop();
System.out.print(tmp2+" ");
list.add(tmp2);
}
} else {
while(true) {
if(stack.isEmpty()) {
break;
}
String tmp2 = (String) stack.peek();
if(tmp2.equals("(")) {
break;
}
tmp2 = (String) stack.pop();
System.out.print(tmp2 + " ");
list.add(tmp2);
}
}
stack.push(tmp);
}
} else if ("(".equals(tmp)) {// 左括号
stack.push(tmp);
} else if(")".equals(tmp)) {// 右括号
while(true) {
if(stack.isEmpty()) {
break;
}
String tmp2 = (String) stack.peek();
if(tmp2.equals("(")) {
stack.pop();
break;
}
tmp2 = (String) stack.pop();
System.out.print(tmp2 + " ");
list.add(tmp2);
}
}
}
while(!stack.isEmpty()) {//将栈中元素依次输出
String tmp = (String) stack.pop();
System.out.print(tmp+" ");
list.add(tmp);
}
Iterator iter = list.iterator();// 开始计算后缀表达式
Stack stack2 = new Stack();
while(iter.hasNext()) {
String tmp = (String) iter.next();
if(StringUtil.IsNum(tmp)) {
stack2.push(tmp);
} else {
int num1 = Integer.parseInt((String)stack2.pop());
int num2 = Integer.parseInt((String)stack2.pop());
if("+".equals(tmp)) {
stack2.push((num1 + num2)+"");
} else if("-".equals(tmp)) {
stack2.push((num2 - num1)+"");
} else if("*".equals(tmp)) {
stack2.push((num1 * num2)+"");
} else {
stack2.push((num2 / num1)+"");
}
res = Integer.parseInt((String) stack2.peek());
}
}
return res;
}
}
四则运算表达式值的获取算法
猜你喜欢
转载自www.cnblogs.com/yuanfei1110111/p/10296666.html
今日推荐
周排行