java 中缀转后缀(逆波兰)


import java.util.Stack;


public class LeetCode_middleTransformToReversePolish {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] input={"9","+","(","3","-","1",")","*","3","+","10","/","2"};
		System.out.println(middleToBack(input));

	}
	
	public static String middleToBack(String[] input)
	{
		int length=input.length;
		String result="";
		boolean isHaveleftToken=false;
		Stack<String> stack=new Stack<>();
		for(int i=0;i<length;i++)
		{
			if(!isOperator(input[i]))
				result=result+input[i];
			else {
				if(stack.isEmpty())
					stack.push(input[i]);
				else if(input[i].equals("*")||input[i].equals("/"))
				{
					String tempeek=stack.peek();
					if(isHaveleftToken)
						stack.push(input[i]);
					else {
						if(tempeek.equals("*")||tempeek.equals("/"))
							result=result+stack.pop();
						
						stack.push(input[i]);
						
					}
				}
				else if(input[i].equals("("))
				{
					isHaveleftToken=true;
					stack.push(input[i]);
				}
				else if(input[i].equals(")"))
				{
					String temp=stack.pop();
					while(!temp.equals("("))
					{
						result=result+temp;
						temp=stack.pop();
						
					}
					isHaveleftToken=false;
					
				}
				else {
					if(isHaveleftToken)
						stack.push(input[i]);
					else {
						while(!stack.isEmpty())
							result=result+stack.pop();
						stack.push(input[i]);
					}
					
				}
						
				
			}
		}
		//加上栈中还没出栈的元素
		while(!stack.isEmpty())
		{
			result=result+stack.pop();
		}
		
		return result;
		
	}
	
	 public static boolean isOperator(String s) 
	 {
		 if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")||s.equals("(")||s.equals(")"))
			 return true;
		 else
			 return false;
	 }

}
整体思路是这样的:遇到数字的话直接输出,遇到右括号 输出左括号上面的所有元素   ,遇到左括号入栈,遇到乘除符号,进行判断如果栈中有左括号或栈顶元素是加减就入栈其余出栈,遇到加减符号,如果栈中有左括号则入栈,否则将栈中元素全部出栈。做完这些处理后,在将栈中还没出栈的加入到输出结果中。亲测有用
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值