逆波兰法(计算器)程序<无括号版>
涉及队列、栈的运用。
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 压入栈中, 这时遇到了运算符 + ...
随机推荐
- 无闻go编程基础笔记
Go语言做Web编程非常方便,并且在开发效率和程序运行效率方面都非常优秀.相比于Java,其最大的优势就是简便易用,而相比于PHP,它最大的优势就是性能好. (go做web)推荐Gorilla的库,里 ...
- 【Codeforces Round #459 (Div. 2) B】 Radio Station
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map模拟一下映射就好了. [代码] #include <bits/stdc++.h> using namespace ...
- 洛谷 P3670 [USACO17OPEN]Bovine Genomics S奶牛基因组(银)
P3670 [USACO17OPEN]Bovine Genomics S奶牛基因组(银) 题目描述 Farmer John owns NN cows with spots and NN cows wi ...
- DataGirdView 常用操作
1.将数据源的某列添加到已有DataGirdView的列 例如:将文件夹下所有文件名添加到DataGirdView 的文件名一列,图片如下: 首先在datagridview把文件名列的DATAPROP ...
- vmware虚拟机Windows 2003上网问题
近期须要在Windows 2003 上面做点操作,于是安装虚拟机玩了一下,发现并不能上网,最后的解决的方法是: 卸载IE增强的安全配置 控制面板→加入或删除程序→加入/删除Windows组件" ...
- findFocus-获得拥有焦点的控件
所有的view控件有一个findFocus方法,这个方法如下 /** * Find the view in the hierarchy rooted at this view that current ...
- Android 给图片 加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- 55.npm install 报错 :stack Error: Can't find Python executable "python"
转自:https://www.cnblogs.com/zengry/p/8044379.html 解决方法 : 1. 安装python , 设置环境变量 :cmd --> path='%path ...
- MathType下载和安装(与Visio搭配使用)
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- LinkCutTree详解
LCT详解 没有比这再详细的了, 相信我