逆波兰法(计算器)程序<无括号版>
涉及队列、栈的运用。
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 压入栈中, 这时遇到了运算符 + ...
随机推荐
- Web 端 js 导出csv文件
http://www.qdfuns.com/notes/35821/2ab249182734d1f5c66da6b5cf395db9.html
- 【Redis哨兵集群】
目录 开始配置主从复制 开始配置Redis Sentinel @ *** 在开始之前,我们先来看看Redis的主从复制 主从复制原理: 从服务器向主服务器发送SYNC命令. 主服务器接到SYNC命令后 ...
- 【Codeforces Round #460 (Div. 2) A】 Supermarket
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 就是让你求m*(ai/bb)的最小值 [代码] #include <bits/stdc++.h> #define dou ...
- 三种连接 & DOS & SYNFLOOD & 防御
accept的时候,三次连接是建立的. 有一种DOS攻击是SYN FLOOD,就是大量的SYN到达,但是没有ACK,无法建立起连接. 防御的方法,有多种,如下: 比如,禁止部分源地址: 到达一定阈值之 ...
- jquery13 attr() prop() val() addClass()等 : 对元素属性的操作
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 57.C++处理转义字符
#include <iostream> #include <string> #include <cstdlib> using namespace std; void ...
- C/C++(函数)
函数 函数三要素:函数名,参数,返回值 重点研究函数的输入输出 随机数函数 //产生一组随机数 #include<stdio.h> #include<stdlib.h> #in ...
- MVC和MTV设计模式
1.MVC MVC最初是由施乐公司旗下的帕罗奥多研究中心中的一位研究人员给 smalltalk语言发明的一中软件设计模式. MVC概述:MVC全名是ModelViewController,是模型(mo ...
- 查看oracle数据库的启动时间
Oracle的sys用户下有个视图v_$instance,该视图只有一行数据.通过SQL语名可查询其内容: select * from sys.v_$instance 此视图可查看很多东西,如实例名, ...
- HUD——T 3836 Equivalent Sets
http://acm.hdu.edu.cn/showproblem.php?pid=3836 Time Limit: 12000/4000 MS (Java/Others) Memory Lim ...