涉及队列、栈的运用。

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. Android控件-TabHost(一)

    什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面.     TabHost选项卡,说到这个组件, ...

  2. UVA 12649 Folding Machine 搜索

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  3. qt获取磁盘序列号

    #include "windows.h" QString lpRootPathName = "c:\\"; LPTSTR lpVolumeNameBuffer= ...

  4. Alcatraz:管理Xcode插件

    简单介绍 Alcatraz是一个帮你管理Xcode插件.模版以及颜色配置的工具. 它能够直接集成到Xcode的图形界面中,让你感觉就像在使用Xcode自带的功能一样. 安装和删除 使用例如以下的命令行 ...

  5. 转:mac环境下使用svn

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  6. Zabbix快速入门

    模板的管理与使用 一 模板 模板是zabbix的核心,因为模板继承了所有要监控的内容,以及所要展示的图形等等,zabbix的安装部署完成之后,自带了很多模板(网络设备模板,操作系统模板,常用应用软件模 ...

  7. 转 EL表达式

    EL表达式 一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java ...

  8. Gym 100952 B. New Job

    B. New Job time limit per test 1 second memory limit per test 64 megabytes input standard input outp ...

  9. Dubbo学习总结(1)——Dubbo入门基础与实例讲解

    Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo是一个分布式服务框架,致力于 ...

  10. WPF MVVM架构 EF、WCF、IOC 设计示例经典

    概要 该演示项目利用WPF应用程序构建的MVVM架构示例, 运用了Unity容器接口注入, MVVM的经典设计, 后台利用的EF+WCF. 后台实现: 从数据库生成的emdx 结合上下文进行数据交互, ...