栈可以用来解决表达式求值问题,其原理是先把字符串从中缀表达式转化为后缀表达式,然后求值。
其中的栈我用的式自己实现的:https://blog.youkuaiyun.com/king8611/article/details/81199061,当然JAVA里也有可以直接调用的栈。
中缀表达式转化为后缀表达式函数:
public static StringBuffer toPostfix(String infix) {
Stack<String> stack = new LinkedStack<String>(); //运算符栈,顺序栈
StringBuffer postfix = new StringBuffer(infix.length()*2); //后缀表达式字符串
int i=0;
while(i<infix.length()){
char ch=infix.charAt(i); //ch提取字符串这一位字符
switch(ch){
case'+':case'-': //处理+ -
while(!stack.isEmpty()&&!stack.peek().equals("("))
postfix.append(stack.pop()); //遇到+ -后(之外的元素都可以加到后缀表达式中
stack.push(ch+""); //然后加上此位
i++;
break;
case'*':case'/': //处理* /
while(!stack.isEmpty()&&(stack.peek().equals('*')||stack.peek().equals('/')))
postfix.append(ch+""); //* /之前的* /加到后缀表达式中
stack.push(ch+""); //然后加上此位
i++;
break;
case'(': //如果是左括号,直接加上
stack.push(ch+"");
i++;
break;
case')': //如果是右括号
String out=stack.pop(); //左括号内的都出栈
while(!stack.isEmpty()&&!stack.peek().equals("(")){
postfix.append(out);
out=stack.pop();
}
i++;
break;
default: //如果碰见数字,那就都加上,直到不能加后加空格
while(i<infix.length()&&ch>='0'&&ch<='9'){
postfix.append(ch+"");
i++;
if(i<infix.length())
ch=infix.charAt(i);
}
postfix.append(" ");
}
}
return postfix;
}
后缀表达式求值函数:
public static int toValue(StringBuffer postifix){
int value=0;
Stack<Integer> stack=new LinkedStack<Integer>(); //一个栈存储操纵数
for(int i=0;i<postifix.length();i++){ //逐一循环检索
char ch=postifix.charAt(i);
if(ch>='0'&&ch<='9'){ //如果是数字,加入栈
value=0;
while(ch!=' '){
value=value*10+ch-'0';
ch=postifix.charAt(++i);
}
stack.push(value);
}
else { //如果是符号,取出栈中两个元素,并做运算后反栈
if(ch!=' '){
int x=stack.pop();
int y=stack.pop();
switch(ch){
case'+':value=x+y;break;
case'-':value=x-y;break;
case'*':value=x*y;break;
case'/':value=x/y;break;
}
stack.push(value);
}}
}
return stack.pop(); //最后栈中的唯一元素就是结果
}
参考书籍《JAVA数据结构》第四版