java 中缀转后缀(逆波兰)[通俗易懂]

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;
	 }

}

总体思路是这种:遇到数字的话直接输出,遇到右括号 输出左括号上面的所有元素   ,遇到左括号入栈。遇到乘除符号。进行推断假设栈中有左括号或栈顶元素是加减就入栈其余出栈。遇到加减符号,假设栈中有左括号则入栈,否则将栈中元素所有出栈。做完这些处理后,在将栈中还没出栈的增加到输出结果中。亲測实用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116029.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Timer时间控件

    Timer时间控件第一步、创建一个Windows窗体,第二步、创建样式,在工具箱中找到TextBox和Labell、Button、timer。第三步、改变属性的Name和Text(就是改写名称)第四步、排版按钮1:使用的控制器是Label;name改为lblTime2:使用的控制器是TextBox;Name改为txtTime3:使用的控制器是Button;Name改为btnGet4…

    2022年5月23日
    52
  • macbookpro找不到麦克风_双系统win7无法启动

    macbookpro找不到麦克风_双系统win7无法启动问题描述通过系统提供的启动转换助理装了win10之后,发现siri提示找不到麦克风,偏好设置中也看不到输入设备解决方案终端执行以下命令后,输入密码即可.无需重启.sudokillallcoreaudiod…

    2022年10月5日
    5
  • 去色怎么用_国际通用的最简单的救生包包括什么

    去色怎么用_国际通用的最简单的救生包包括什么2019独角兽企业重金招聘Python工程师标准>>>…

    2022年10月6日
    2
  • win8最流畅的设置方法_Windows 12

    win8最流畅的设置方法_Windows 12indowsXP终极优化设置(精心整理篇)◆一、系统优化设置◆1、系统常规优化1)关闭系统属性中的特效,这可是简单有效的提速良方。点击开始→控制面板→系统→高级→性能→设置→在视觉效果中,设置为调整为最佳性能→确定即可。2)“我的电脑”-“属性”-“高级”-“错误报告”-选择“禁用错误汇报”。3)再点“启动和故障恢复”-“设置”,将“将事件写入系统日志”、“发送管理警报”、“自动重新启动”这三项

    2022年10月21日
    4
  • windows安装包制作工具Inno Setup简介

    windows安装包制作工具Inno Setup简介InnoSetup是一个免费的Windows安装程序制作软件;给出了示例程序。

    2025年6月6日
    2
  • n个进程访问一个临界资源,则设置的互斥信号量_多线程同步和互斥有几种实现方法

    n个进程访问一个临界资源,则设置的互斥信号量_多线程同步和互斥有几种实现方法一、【临界区】每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界 资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区, 进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程 必须互斥地对它进行访问。多个进程中涉及到同一个临界资源的临界区称为相关临界区。【进程进入临界区的调度原则】如果有若干进程要求进入空闲的临界区,一…

    2022年8月18日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号