package com.yj.rpn;

import java.util.*;

import java.util.logging.StreamHandler;

/**

* Created by yanjie on 17/10/31.

* 逆波兰式

* 使用到的符号

* #

* +-

* *\\/

* () 括号比较特殊

*/

public class RPN {

private Map sy = new HashMap();

public RPN(){

sy.put("#",0);

sy.put("(",0);

sy.put(")",0);

sy.put("+",1);

sy.put("-",1);

sy.put("*",2);

sy.put("/",2);

}

private Stack s1 = new Stack();

private Stack s2 = new Stack();

public String getRpn(String s){

s1.add("#");

Boolean pre = false;

for(int i=0; i

char c = s.charAt(i);

//识别操作数

String t = "";

while(i

t = t + c;

if(++i>=s.length()){

break;

}

c = s.charAt(i);

}

if(!t.equals("")){

s2.add(t);

}

if(i>=s.length()){

break;

}

switch (c){

case '('://取出的字符是“(”,则直接送入S1栈顶

s1.add(c+"");

break;

case ')'://取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”

t = s1.pop();

while(!t.equals("(")){

s2.add(t);

t = s1.pop();

}

break;

default:

String s1c = s1.peek();

//当前运算符优先级大于s1栈顶优先级,运算符存入s1

if(sy.get(c+"")>sy.get(s1c)){

s1.add(c+"");

}else{//将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,最后将该运算符送入S1栈

while(sy.get(s1c)>=sy.get(c+"")){

s1c = s1.pop();

s2.add(s1c);

}

s1.add(c+"");

}

}

}

String t = s1.pop();

while(!t.equals("#")){

s2.add(t);

t = s1.pop();

}

String result = "";

while(s2.size()>0){

result = s2.pop() +" "+ result;

}

return result;

}

//main method

public static void main(String[] args) {

RPN rpn = new RPN();

String result = rpn.getRpn("1+2*3");

System.out.println(result);

result = rpn.getRpn("(1+2)*3");

System.out.println(result);

result = rpn.getRpn("(a+cc)*3");

System.out.println(result);

}

}

JAVA实现逆波兰转换,java实现逆波兰式相关推荐

  1. 【Java】日期字符串转换java.sql.Date对象

    日期字符串 → java.sql.Date对象 import java.text.ParseException; import java.text.SimpleDateFormat;public cl ...

  2. java不同时区时间转换,Java在不同时区转换时间

    本文中,我们将展示如何在不同时区之间转换时间,我们分别使用Date.Calendar.Joda Time. 本例从新加坡时区 (GMT+8:00) Asia/Singapore - Singapore ...

  3. java不同时区时间转换,Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的 我们的系统在国外打印的日志时间由于时差关系和国内不一致 看起来不方便 希望国外的日志和国内保持一致 即 需要对不同时区的时间做转换调整 统一为国内时间. 一.关于时区的一些概 ...

  4. java整数能强转转字符,Java中数据类型默认转换和强制类型转换

    默认转换: a:由低到高一次为:(byte   short    char  )---int ---long ---float --- double b:注意:byte   short    char ...

  5. java百度地图逆地址解析_百度地图逆地址解析

    什么是Geocoding? Geocoding API 是一类简单的HTTP接口,用于提供从地址到经纬度坐标或者从经纬度坐标到地址的转换服务,用户可以使用C# .C++.Java等开发语言发送HTTP ...

  6. java一维数组正序输出,java将一个数组逆序输出-java将一个数组逆序输出的方法-吾爱编程网...

    今天吾爱编程为大家分享一下Java的经典实例之一:java将一个数组逆序输出,有需要的小伙伴可以参考: 1.题目要求: 使用Java编程一个程序,将一个数组逆序输出 2.程序代码:public sta ...

  7. 面渣逆袭:Java并发六十问,图文详解,快来看看你会多少道

    基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单位. 并行就是同一时刻,两个线程都在执行.这就要求有两个CPU去分别执行两个线程. 并发就是同一时刻,只有一个执行,但是 ...

  8. 逆序对计数问题(java实现)

    一,相关定义 1.什么是逆序数? 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 例如:在序列 { 2, ...

  9. 面渣逆袭:Java基础五十三问,快来看看有没有你不会的

    这节我们回到梦开始的地方--Java基础,其实过了萌新阶段,面试问基础就问的不多,但是保不齐突然问一下.想一下,总不能张口高并发.闭口分布式,结果什么是面向对象,说不清,那多少有点魔幻.所以赶紧来看看 ...

最新文章

  1. Springsecurity之AccessDecisionManager
  2. Maven命令行使用:mvn clean install(安装)
  3. 以新ICT构建全联接的电力物联网,迈入能源智能时代
  4. Missing artifact com.sun:tools:jar 1.5.0 终极解决方法
  5. gis中开始编辑之后显示空间参考_空间参考—帮助 | ArcGIS Desktop
  6. Mysql索引使用情况_介绍mysql索引失效的情况
  7. Python数据分析实战:使用pyecharts进行数据可视化
  8. php上搭建dvwa,使用phpstudy在windows上搭建DVWA
  9. ERROR: libopenjp2 = 2.1.0 not found using pkg-config
  10. 一个websocket 可以多个页面创建吗_聊聊 WebSocket,还有 HTTP
  11. Windows系统-删除指定服务!
  12. 精选的 Go 框架,库和软件的精选清单
  13. 网络故障排除的4款软件
  14. 2019-07高德地图行政区域省市区json数据获取(php代码)
  15. 少年,我看你骨骼精奇,见与你有缘,这套算法赠你
  16. 电脑是否存在内存泄漏_如何避免内存泄露
  17. Unity中的万向节死锁
  18. TCPDF 解决中文乱码的问题
  19. UNETR 论文精解
  20. 计算机研究生论文写作 问题记录

热门文章

  1. 平衡二叉树(注意LR和RL)
  2. 安卓手机运行ios教程_英雄联盟手游公测,安卓/苹果iOS注册下载教程!
  3. 中国移动NBIOT卡的几种APN应用场景
  4. Android 自定义键盘 随机键盘
  5. 区块链学习2——区块链浏览器的搭建
  6. 看看别人怎么学习的。
  7. HTTP 代理原理及实现
  8. SAP中有些物料凭证不能用MBST冲销的原因分析
  9. 宝存科技推出全球首款大量商用级别的高性能Open-Channel SSD
  10. java返回图片base64_java将图片转为base64返回给前端