题目
题目描述
将中缀表达式转为后缀表达式,输入 a+bc/d-a+f/b 输出 abcd/+a-fb/+
要求:语言不限;输入输出均为单个字符串;操作数用单个小写字母表示,操作符只需支持 ±*/,按照四则运算顺序确定优先级,不包含括号
示例1
输入:a+bc/d-a+f/b
输出:abcd/+a-fb/+
分析
- 引入一个StringbBuilder和一个栈,字母都append到StringBuilder中,字符压入栈;
- 字符在入栈之前要和栈顶元素比较,若优先级小于等于栈顶元素,则要依次将栈顶元素出栈,直到优先级大于栈顶元素,或者栈空了为止;
- 最后如果栈中还有元素,则将栈中元素输出即可。
代码
import java.util.Scanner;
import java.util.Stack;
public class Main{
public static StringBuilder getPostfix(String s){
/*
引入栈,栈中存放操作符;
如果字符为字母,则直接加到Stringbuffer里面;
如果字符为操作符,则判断其与栈顶元素的优先级大小,
若优先级小于等于栈顶元素,则将栈顶元素依次出栈,并将当前操作符入栈
否则当前操作符入栈;最后若栈非空,则依次输出栈中元素
*/
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
for(int i=0; i<s.length(); i++){ //字母
char ch = s.charAt(i);
if(ch >= 'a' && ch <= 'z'){
sb.append(ch);
}else{ //操作符
while(!stack.isEmpty() && priority(ch) <= priority(stack.peek())){
sb.append(stack.pop()); //将栈内优先级大的操作符出栈
}
stack.push(ch); //优先级小的操作符入栈
}
}
while(!stack.isEmpty()){
sb.append(stack.pop());
}
return sb;
}
//计算优先级
public static int priority(char c){
int pri = 0;
if(c == '+' || c == '-'){
pri = 1;
}else if(c == '*' || c == '/'){
pri = 2;
}
return pri;
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
StringBuilder sb = getPostfix(s);
System.out.print(sb.toString());
sc.close();
}
}