使用栈完成简单的算数解析
算法思路:构建两个栈,一个栈用来储存字符,另一个栈用来储存数字。
储存字符的栈 s1 和储存数 的栈 s2。
在计算阶段:
从左到右依次进行解析。
1:如果是数字就直接压入s2中
2:如果是+或-,其优先级最低,如果s1中不为空,则拿出来进行计算之后在压入栈。
3:如果是*或、,其优先级较高,如果s1中不为空,前一个字符是+或-的话就直接压入栈中,如果是*或/的话则把前一个字符拿出来计算之后在压入栈中
4:如果是(,就直接压入栈中。
5:如果是),就把到s1中的第一个(之前的运算符全部拿出做计算,之后在移除(。
代码实现:
import java.util.AbstractList;
import java.util.Stack;
public class Teext5 {
public static int evaluateExpression(String s){
Stack <Character> s1 = new Stack<Character>();
Stack <Integer> s2 = new Stack<Integer>();
for(int i = 0; i < s.length(); i ++){
int a = s.charAt(i);
if(a <= 57 && a >= 48){
s2.push(a - 48);
}
else if(s.charAt(i) == '+' || s.charAt(i) == '-'){
if(s1.isEmpty() == false &&
(s1.peek() == '+' ||
s1.peek() == '-' ||
s1.peek() == '*' ||
s1.peek() == '/')){
jisuan(s1, s2);
}
s1.push(s.charAt(i));
}
else if(s.charAt(i) == '*' || s.charAt(i) == '/'){
if(s1.isEmpty() == false &&
(s1.peek() == '*' ||
s1.peek() == '/')){
jisuan(s1, s2);
}
s1.push(s.charAt(i));
}
else if(s.charAt(i) == '('){
s1.push(s.charAt(i));
}
else if(s.charAt(i) == ')'){
while(s1.peek() != '(')
jisuan(s1, s2);
s1.pop();
}
}
while(!s1.isEmpty()){
jisuan(s1, s2);
}
return s2.peek();
}
private static void jisuan(Stack<Character> s1, Stack<Integer> s2){
char c = s1.pop();
int a1 = s2.pop();
int a2 = s2.pop();
int a;
if(c == '+')
s2.push(a1 + a2);
if(c == '-')
s2.push(a2 - a1);
if(c == '*')
s2.push(a1 * a2);
if(c == '/')
s2.push(a2 / a1);
}
public static void main(String args[]){
String s = "1+2-5*(1+2)";
int a = evaluateExpression(s);
System.out.println(a);
}
}