zoukankan      html  css  js  c++  java
  • 波兰表示法和逆波兰表示法的转换

    笔试题算法实现

    最近有很多笔试算法题,碰到了一道很陌生的:波兰表示法和逆波兰表示法的转换,用java代码实现了一下,题解给的实例跑通了,不知道其他的怎么样。
    题干如下:题干描述

    思路

    • 从后向前遍历输入的字符数组
    • 根据题干中前波的表示方法入栈
    • 输出前波的结果,与给出示例表达式对比
    • *将正确的前波拆分入栈
    • 规则为遇到右括号出栈四项值,分别为:左括号,表达式左值,表达式,表达式右值
    • 按后波的规则拼接,并入栈
    • 最后栈中的就是结果

    java代码如下

    ####  **写的仓促变量定义有点乱**
    
    import java.util.ArrayList;
    import java.util.Stack;
    
    
    public class Main {
    	public static void main(String[] args) {
    		String str="-,+,a,*,+,b,c,d,e";
    		String[] strs=str.split(",");
    		Stack<String> stac=new Stack<String>();
    		
    		ArrayList<String> al=new ArrayList<String>();
    		al.add("+");al.add("-");al.add("*");al.add("/");// 存放标点值
    		
    		int i=strs.length-1;
    		while(i>=0){
    			
    			if(!al.contains(strs[i])){
    				stac.push(strs[i]);
    			}else{
    					String one=stac.pop();
    					String two=stac.pop();
    					String tem="("+one+strs[i]+two+")"; // 全部添加括号保证 下边运算的正确顺序
    					stac.push(tem);
    			}
    			i--;
    		}
    		
    		Stack<String> sta1=new Stack<String>();
    		String[] re=stac.pop().split("");
    		int j=0;
    		while(j<re.length){
    			if(!re[j].equals(")")){
    				sta1.push(re[j]);
    			}else{
    				String one=sta1.pop();
    				String two=sta1.pop();
    				String three=sta1.pop();
    				String four=sta1.pop();//  仅仅是将左括号 去除掉
    				String tem=""+three+one+two;
    				sta1.push(tem);
    			}
    			j++;
    		}
    		System.out.println(sta1.pop());
    	}
    }
    
    

    可直接运行,通过题解中示例,不知道其他的对不对

    另外,由于代码中输入已写死,所以没有考虑边界不符合情况

    可顶可踩可留言!

  • 相关阅读:
    原创 爱因斯坦迷题及推导过程
    惊闻姑姑家女婿去世,哀叹生命之脆弱,死亡如此接近
    京东自营预售逻辑
    自营SKU绑定逻辑
    自营结算解释&对账逻辑
    CPS逻辑
    京东搜索结果数据异常
    C++静态库中使用_declspec(dllexport) 不能导出函数的问题
    HTTP+SVN访问速度慢的问题
    Python log
  • 原文地址:https://www.cnblogs.com/CHWYH/p/5845689.html
Copyright © 2011-2022 走看看