java实现整数计算器
计算器代码
package stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
// TODO Auto-generated method stub
//中缀转后缀
Scanner in =new Scanner(System.in);
System.out.println("请输入一个计算式:");
String exepression=in.next();
List<String> ls=toInfixExpressionList(exepression);
System.out.println(ls);
List<String> parsesiffixexpression=parseSuffixExpressionList(ls);
System.out.println("后缀表达式对应的List:"+parsesiffixexpression);
System.out.printf("运算结果%d\n",calculate(parsesiffixexpression));
}
public static List<String> parseSuffixExpressionList(List<String> ls){
//符号栈
Stack<String> s1=new Stack<String>();
//储存中间结果
List<String> s2=new ArrayList<String>();
//遍历
for(String item:ls) {
//如果是一个数就加入s2
if(item.matches("\\d+")) {
s2.add(item);
}else if(item.equals("(")) {
s1.push(item);
}else if(item.equals(")")){
//依次弹出
while(!s1.peek().equals("(")) {
s2.add(s1.pop());
}
s1.pop();//消掉小括号,消除小括号
}else {
//优先级的问题
//当item的优先级小于等于栈顶的优先级
//缺少一个比较优先级高低的方法
while(s1.size()!=0&&Operation.getValue(s1.peek())>=Operation.getValue(item)) {
s2.add(s1.pop());
}
//还需要将item栈中
s1.push(item);
}
}
while(s1.size()!=0) {
s2.add(s1.pop());
}
return s2;
}
//将中缀表达式转化为对应的List
public static List<String> toInfixExpressionList(String s){
List<String> ls=new ArrayList<String>();
int i=0;
String str;
char c;
do {
//如果c一个非数字,就需要加入到ls中去
if((c=s.charAt(i))<48||(c=s.charAt(i))>57) {
ls.add(""+c);
i++;
}else {//如果是一个数字
str="";//先将字符串置空
while(i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57) {
str+=c;//拼接
i++;
}
ls.add(str);
}
}while(i<s.length());
return ls;
}
public static int calculate(List<String> ls) {
Stack<String> stack=new Stack<String>();
for(String item :ls) {
if(item.matches("\\d+")) {//多位数直接入栈
stack.push(item);
}else {
//pop出两个数组
int num2=Integer.parseInt(stack.pop());
int num1=Integer.parseInt(stack.pop());
int res=0;
if(item.equals("+")) {
res=num1+num2;
stack.push(""+res);
}
else if(item.equals("-")) {
res=num1-num2;
stack.push(""+res);
}
else if(item.equals("*")) {
res=num1*num2;
stack.push(""+res);
}
else if(item.equals("/")) {
res=num1/num2;
stack.push(""+res);
}
}
}
return Integer.parseInt(stack.peek());
}
}
//编写一个了类返回一个运算符号的优先级
class Operation{
private static int ADD=1;
private static int SUB=1;
private static int MUL=2;
private static int DIV=2;
//写一个方法,返回对应优先级的数字
public static int getValue(String oper) {
int result=0;
switch (oper) {
case "+":
result=ADD;
break;
case "-":
result=SUB;
break;
case "*":
result=MUL;
break;
case "/":
result=DIV;
break;
default:
System.out.println("不存在该运算符号");
break;
}
return result;
}
}
java实现整数计算器的更多相关文章
- java 基础 整数类型
1.Java有四种整数类型:byte.short.int和long. 2.Java默认整数计算的结果是int类型. 3.整数的字面量是int类型. 4.若字面量超过int类型的最大值,则字面量是lon ...
- Java打印整数的二进制表示(代码与解析)
Java打印整数的二进制表示(代码与解析) int a=-99; for(int i=0;i<32;i++){ int t=(a & 0x80000000>>>i)&g ...
- Java之整数运算
Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号.四则运算规则和初等数学一致.例如: public class Main { public static void main(String[ ...
- Java 判断整数方法
今天写代码的时候突然想到要怎么来判断整数,然后通过判断是否是整数来处理相关的操作.开始想到了几个方法,比如百度到的 x(int) instanceof Integer,但是这样的话程序会报错,还有一个 ...
- Java SWT 做计算器。
java -- swt - - 计算器 环境搭建 安装java.eclipse.以及对应的swt插件. 开始工程 建立工程: 在java下建立一个在其他 —- WindowsBuilder — ...
- java中整数类型(short int long)的存储方式
在java中的整数类型有四种,分别是 byte short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1.基本类型:short 二进制位数:16包装 ...
- Java语言编写计算器(简单的计算器)
Java编写的一个简单计算器,本人还比较菜,只能这样了,有点代码冗余,不能连续计算. import javax.swing.*; import java.awt.*; import java.awt. ...
- java SWT/Rap 计算器版本2(键盘鼠标兼容)
package cn.lesaas.nof.rwtswt.ui.dialog; import java.math.BigDecimal; import org.eclipse.swt.SWT;impo ...
- 自己动手写Java大整数《3》除法和十进制转换
之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...
随机推荐
- JAVA如何跳出多层循环
1. break.continue.return 的区别: break默认是跳出最里层的循环,也就是break所在的最近的那层循环 continue是终止本次循环,继续下次循环 return 结束当前 ...
- ReactJS 结合 antd-mobile 开发 h5 应用基本配置
在 ReactJS 较为初级的使用 antd-mobile 使用时候直接加载 node_modules 文件中的相关 CSS,这个使用方法效率低:更高明的方法则按需加载,需要设置如下: 在 packa ...
- Linux下测试CPU性能
一.安装stress服务 1.下载stress_1.0.1.orig.tar.gz安装包 2.解压tar xvf stress_1.0.1.orig.tar.gz 3.进入解压目录执行./config ...
- 解决eclipse无法部署工程到tomcat运行的问题
当在tomcat想加入工程时在列表没发现要的项目时, 引起这个错误提示的原因是:项目里的.project文件和.settings文件的缺失或者错误.而不能适用于现在的tomcat. 解决办法如下: 右 ...
- [前端][自定义DOM事件]不使用setTimeout实现双击事件或n击事件
使用setTimeout实现双击事件 例如,这样: let div = document.getElementById("div"); doubleClick(div, funct ...
- JS 由前端保存到文件
function doSave(value, type, name) { var blob; if (typeof window.Blob == "function") { blo ...
- mysql5.7.25搭建mysql-5.7.25.tar.gz包(亲验)
STEP 1. 下载 去往官方下载MySQL包.http://dev.mysql.com mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz STEP 2. 解压缩 ...
- loggin模块,错误日志模块
# 记录用户行为或者报错信息 import logging # 配置错误日志有两种方法 # 方法1:通过basicconfig # 配置简单.但是能做的事情少,解决不了中文乱码,不能同时输出到屏幕和文 ...
- P1070道路游戏题解
日常吐槽 作为hin久hin久以前考试考到过的一道题窝一直咕咕咕到现在才想起来去做因为讲解都忘干净了然后自己重新考虑发现被卡了3天 题面 看到题目发现这题的dp状态似乎有点不是很明确? 我们来理一理题 ...
- eclipse subclipse svn 插件安装使用
一.在线安装 1.打开Eclipse,菜单栏中选择"Help"->"Install New SoftWare..." 2.在弹出的对话框中,点击" ...