思路
- 数据结构用栈。
- 用Map的形式将操作符的优先级进行定义
- 分为以下四种情况:
第一,字符为数字时,直接输出
第二,字符为’(‘时,压入栈
第三,字符为’)‘时,将栈内’('前的操作符全部输出
第四,字符为操作符,即±*\时,若优先级比栈顶操作符高,直接压入栈。否则,将栈顶元素输出,然后压入栈。 - 当所有字符读完后,将栈内操作符输出。
实现
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
public class InfixToPostfix_v1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String result = "";
if(scan.hasNextLine())
{
String str = scan.nextLine();
result = infixToPost(str);
}
System.out.println(result);
}
public static String infixToPost(String expression)
{
Stack<Character> stack = new Stack<>();
String result = "";
Map<Character,Integer> map = new HashMap<>();
map.put('*',2);
map.put('/',2);
map.put('+',1);
map.put('-',1);
map.put('(',0);
map.put(')',0);
for(int i = 0;i<expression.length();i++)
{
if((expression.charAt(i)<='9')&&(expression.charAt(i)>='0'))
{
result += expression.charAt(i);
}
else if(expression.charAt(i) == '(')
{
stack.push(expression.charAt(i));
}
else if(expression.charAt(i) == ')')
{
while(true)
{
char item = stack.pop();
if(item != '(')
{
result += item;
}
else
{
break;
}
}
}
else if(expression.charAt(i) == ' ')
{
result += expression.charAt(i);
}
else
{
if(stack.isEmpty())
{
stack.push(expression.charAt(i));
}
else
{
char item = stack.pop();
if(map.get(item) < map.get(expression.charAt(i)) )
{
stack.push(item);
stack.push(expression.charAt(i));
}
else
{
result += item;
stack.push(expression.charAt(i));
}
}
}
}
while(!stack.isEmpty())
{
char item = stack.pop();
result += item;
}
return result;
}
}
运行结果