package test;
/*
设立一个栈,存放运算符,首先栈为空,编译程序从左到右扫描中缀表达式,
若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
若遇到运算符,则必须与栈顶比较,运算符级别比栈顶级别高则进栈,否则退出栈顶所有元素并输出,然后输出一个空格作分隔符;
若遇到左括号,进栈;
若遇到右括号,则一直退栈输出,直到退到左括号止。
当栈变成空时,输出的结果即为后缀表达式。
10以内的数学表达式
*/
import java.util.Stack;
public class StackTest {
private String endExpression;
private Stack<Character> stack;
public StackTest(){
this.endExpression = "";
this.stack = new Stack<Character>();
}
public String endExp(String content){
//循环遍历字符串
for(int i=0; i < content.length(); i++){
char ch = content.charAt(i);
//若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
if(ch >= '0' && ch <= '9'){
this.endExpression += ch + " ";
}
//switch中continue和break有什么区别?
switch (ch) {
//若遇到左括号,进栈
case '(':{
this.stack.push(ch);
break;
}
//若遇到右括号,则一直退栈输出,直到退到左括号止。
case ')':{
while(!this.stack.isEmpty() && !(this.stack.peek() == '(')){
this.endExpression += this.stack.pop() + " ";
}
//去掉(括号
this.stack.pop();
break;
}
case '*':
case '/':{
//若遇到运算符,则必须与栈顶比较,运算符级别比栈顶级别高则进栈
if(this.stack.isEmpty() || this.stack.peek() == '(' || this.stack.peek() == '+' || this.stack.peek() == '-'){
stack.push(ch);
}
break;
}
case '+':
case '-':{
//+—优先级最低,所以所有运算符出栈
while(!this.stack.isEmpty() && !(this.stack.peek() == '(')){
this.endExpression += this.stack.pop() + " ";
}
//将最后运算符入栈
if(this.stack.isEmpty() || this.stack.peek() == '('){
this.stack.push(ch);
}
break;
}
default:
break;
}
}
//当栈变成空时,输出的结果即为后缀表达式。
while(!this.stack.isEmpty()){
this.endExpression += this.stack.pop() + " ";
}
return this.endExpression;
}
public static void main(String[] args){
String s = "1+2*3-4";
StackTest st = new StackTest();
String result = st.endExp(s);
System.out.println(result);
}
}
PS:+、-运算符优先级最低,所有运算符出栈
代码过于拙劣,未加错误提示信息,仅支持10以内表达式,望各位大大多多指教,批评指正。
刚在CSDN看到一句话,和大家共勉:
编程中最没用的东西是源代码,最有用的东西是算法和数据结构。