题目:http://www.patest.cn/contests/ds/3-06
参考:http://www.nowamagic.net/librarys/veda/detail/2307
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
例:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
/**
* @author chenhong
*
*
* */
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] str = scanner.next().toCharArray();
LinkedList<Character> stack = new LinkedList<Character>();
boolean space = false;
boolean isFirst = true;
for(int i=0;i<str.length;i++)
{
if(space)
{
space= false;
System.out.print(" ");
}
//注意没有考虑到 1+(-2+2) 这样地负数情况
if(isFirst && (str[i]=='-' || str[i]=='+'))
{
if(str[i]!='+')
{
System.out.print(str[i]);
}
isFirst=false;
continue;
}
isFirst=false;
//如果是数字就输出
if( ('0'<=str[i] && str[i]<='9') || str[i]=='.' )
System.out.print(str[i]);
//如果是运算符,分情况处理
else
{
if(str[i]==')')
{
char temp;
while( (temp=stack.pop())!='(' )
{
System.out.print(" "+temp);
space = false;
}
}
else if(str[i]=='(')
{
stack.push(str[i]);
isFirst=true;
}
//栈为空,就压入栈
else if(stack.size()<=0)
{
space = true;
stack.push(str[i]);
}
//栈不为空,且不是(),根据栈顶元素来判断做何种操作
else
{ space = true;
//获取栈顶元素
char temp = stack.peek();
if(temp=='*' || temp=='/')
{
if(str[i]=='+' || str[i]=='-')
{
while(!stack.isEmpty() && stack.peek()!='(')
{
System.out.print(" "+stack.pop());
}
stack.push(str[i]);
}
else
stack.push(str[i]);
}
else
{
stack.push(str[i]);
}
}
}
}
while(!stack.isEmpty())
{
System.out.print(" "+stack.pop());
}
}
}