涉及队列、栈的运用。

Java中队列可以用:

Queue<String> q = new LinkedList();

来声明,其主要的方法有:

poll(),peak(),offer(),clear(),size()等。

Java中栈可以用:

Stack s = new Stack();

来声明,其主要方法有:
push(),peak(),pop(),clear(),size()等。

 package preTest;

 import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack; //逆波兰表示法
public class nbl {
public static Stack sigStack = new Stack();
public static Queue<String> nblQueue = new LinkedList();
public static Stack numFromQueue = new Stack();
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
String str = in.nextLine();
int result = cal(str);
System.out.println(result);
}
} public static int cal(String str){
sigStack.clear();
nblQueue.clear();
StringBuilder sb = new StringBuilder();
int len = str.length();
int result= 0;
//压栈和入队操作
for(int i=0; i<len;i++){
char c = str.charAt(i);
if(c>='0' && c <='9'){
sb.append(c);
if(i==len-1){
nblQueue.offer(sb.toString());
}
}else{
nblQueue.offer(sb.toString());
sb.replace(0, sb.length(), "");
if(sigStack.size() == 0){
sigStack.push(c);
}else{
char existed = (char)sigStack.peek();
//如果已经压栈的符号优先级>=当前符号c,则完成压栈符号的操作
if(c=='+' || c=='-'){
zhengli();
sigStack.push(c);
//当两个都是乘除运算时
}else if(existed =='*' || existed == '/'){
tinyAdjust(c);
}else{//新符号乘除,旧符号加减
sigStack.push(c);
}
}
}
}
zhengli();
//出队操作
numFromQueue.clear();
result = releaseQueue();
return result;
} public static void zhengli(){
while(sigStack.size() > 0){
char c = (char)sigStack.pop();
nblQueue.offer(new StringBuilder().append(c).toString());
}
} public static void tinyAdjust(char c){
char ch = (char)sigStack.pop();
nblQueue.offer(new StringBuilder().append(ch).toString());
sigStack.push(c);
} public static int releaseQueue(){
int len = nblQueue.size();
boolean isNum = false;
for(int i=0; i<len; i++){
isNum = judge();
if(isNum){
int num = Integer.parseInt(nblQueue.poll());
numFromQueue.push(num);
}else{
int a = (int)numFromQueue.pop();
int b = (int)numFromQueue.pop();
char c = nblQueue.poll().charAt(0);
int res = compute(b,a,c);
numFromQueue.push(res);
}
}
return (int)numFromQueue.pop();
} public static boolean judge(){
String str = nblQueue.peek();
char c = str.charAt(0);
if(c>='0' && c<='9'){
return true;
}else{
return false;
}
} //简单加减乘除计算
public static int compute(int a, int b, char c){
int result = 0;
switch(c){
case '+': result = a+b;
break;
case '-': result = a-b;
break;
case '*': result = a*b;
break;
case '/': result = a/b;
break;
}
return result;
} }

逆波兰法(计算器)程序<无括号版>的更多相关文章

  1. 逆波兰法求解数学表达示(C++)

    主要是栈的应用,里面有两个函数deleteSpace(),stringToDouble()在我还有一篇博客其中:对string的一些扩展函数. 本程序仅仅是主要的功能实现,没有差错控制. #inclu ...

  2. Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析

    Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...

  3. c++实现将表达式转换为逆波兰表达式

    https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...

  4. Java Evaluate Reverse Polish Notation(逆波兰式)

    表情:: ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) ...

  5. 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)

    定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...

  6. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  7. LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  8. 怎么实现Linux下的逆波兰计算器dc?

    #返回上一级 @Author: 张海拔 @Update: 2014-01-12 @Link: http://www.cnblogs.com/zhanghaiba/p/3516660.html /* * ...

  9. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

随机推荐

  1. 【转载】jQuery弹出层始终垂直居中于当前屏幕

    一般网站上肯定有一些弹出框,不论弹出框的大小,都需要他在当前窗口垂直居中.之前手上就有一个jQuery的例子,后来才发现,他只能在第一屏垂直居中,如果滑动滚动条,弹出的框就在上方,不是很方便.请教朋友 ...

  2. @Mapper注解在springboot中无法注入

    问题① @Mapper注解报红无法注入 方法 在pom文件中添加依赖

  3. 使用UltraEdit配置多行注释和取消多行注释

    UltraEdit功能强大,使用方便,成为软件开发者必备的文档和代码编辑工具.有很多人也直接用它来写代码,如C/Java,脚本如:Perl/Tcl/JavaScript 等. 如果用来写代码,有一个不 ...

  4. mysql查一张表有哪些索引

    可以用这个命令: show index from table_name; 得到输出: +------------------+------------+------------+----------- ...

  5. [当我在研究Cocos-2dx的源代码时,我在想什么]-Ref类,一切的起源

    [名词解释]      引用计数:引用计数是现代内存管理中常常使用到的一个概念.它的基本思想是通过计数方式实现多个不同对象同一时候引用一个共享对象,详细地讲,当创建一个对象的实例并在堆上分配内存时,对 ...

  6. DOM节点的创建、插入、删除、查找、替换

    在前端开发中,js与html联系最紧密的莫过于对DOM的操作了,本文为大家分享一些DOM节点的基本操作. 一.创建DOM节点 使用的命令是 var oDiv = document.createElem ...

  7. deep-in-es6(三)

    模板字符串:反撇号(`)包起来的内容. eg: var str = `assassin`; console.log(str); 模板占位符:${};可达到数据的渲染,在占位符中可以是表达式,运算符,函 ...

  8. Linux网卡驱动框架及制作虚拟网卡

    1.概述 网卡驱动与硬件相关,主要负责收发网络的数据包,将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议. 网卡设备与字符设备,块设备不同,网络设备驱动程序 ...

  9. PHP截取字符串长度

    <?php function str_cut($string, $start=0,$length, $dot = '..') {    $strlen = strlen($string);    ...

  10. Git学习总结(2)——初识 GitHub

    1. 写在前面 我一直认为 GitHub 是程序员必备技能,程序员应该没有不知道 GitHub 的才对,没想到这两天留言里给我留言最多的就是想让我写关于 GitHub 的教程,说看了不少资料还是一头雾 ...