逆波兰法(计算器)程序<无括号版>
涉及队列、栈的运用。
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;
} }
逆波兰法(计算器)程序<无括号版>的更多相关文章
- 逆波兰法求解数学表达示(C++)
主要是栈的应用,里面有两个函数deleteSpace(),stringToDouble()在我还有一篇博客其中:对string的一些扩展函数. 本程序仅仅是主要的功能实现,没有差错控制. #inclu ...
- Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析
Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...
- c++实现将表达式转换为逆波兰表达式
https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...
- Java Evaluate Reverse Polish Notation(逆波兰式)
表情:: ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) ...
- 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)
定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- 怎么实现Linux下的逆波兰计算器dc?
#返回上一级 @Author: 张海拔 @Update: 2014-01-12 @Link: http://www.cnblogs.com/zhanghaiba/p/3516660.html /* * ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
随机推荐
- 分享一下js正则中惰性与贪婪
首先引入一个介绍比较详细的网站 http://www.cnblogs.com/yuaima/p/5258513.html http://www.jb51.net/article/31491.htm 接 ...
- 实现人脸识别性别之路---try语句的使用
Try语句 用法:处理异常信息 存在的形式:try-except X-except T...-except-else-finally(其中X T为错误的类型) 表达意思:try语句是执行正常语句,如果 ...
- 记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法
今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...
- 如何获取repeater某行第一列的值
<div> <asp:Repeater ID="Repeater1" runat="server" DataMember="Defa ...
- oracle 数据库批处理文件
文件夹结构 初始化脚本 |----orcl_sql |----init_user.sql |----tab_home.sql |----TAB_USER.sql |----init.bat init. ...
- 解决 php7 cli 模式下中文乱码的两中方法
解决 php7 cli 模式下中文乱码的两中方法1. 给PHP文件开头加上 exec('chcp 936'); 然后把该文件以 ANSI 格式编码2. 在 php.ini 中设置 default_ch ...
- git 回滚到任意版本
git回滚到任意版本 1.先显示提交的log $ git log -3 commit 4dc08bb8996a6ee02f Author: Mark <xxx@xx.com> Date: ...
- 10.cocos2d坐标系
一.笛卡儿坐标系 OpenGl坐标系为笛卡儿右手系.x向右,y向上,z向外.在cocos2d-lua中坐标系原点在屏幕的左下角,x向右,y向上,z则是指的zorder(层级). 二.世界坐标系,本地坐 ...
- pix格式的一些摸索
作者:朱金灿 来源:http://blog.csdn.net/clever101 以前因为工作关系研究过PCI的系统格式pix,但是遗留了一些问题,最近又想重新解决这些问题.研究了一天,有些收获,但是 ...
- SuSe Linux Enterprise Server 10 With Sp2 安装过程图解
SuSe Linux Enterprise Server 10 With Sp2 安装过程图解 650) this.width=650;" style="border-right- ...