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( ...
随机推荐
- [深度学习] R-CNN系论文略读
总结: 一.R-CNN 摘要: 在对象检测方面,其性能在前几年就达到了一个比较稳定的状态.性能最好的方法是一种复杂的整体系统,它将多个图片的低级特征通过上下文组合起来. 本文提出了一种简单.可扩展的算 ...
- qtmaind.lib(qtmain_win.obj) : error LNK2019: 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用
报错:qtmaind.lib(qtmain_win.obj) : error LNK2019: 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被 ...
- docker安装mysql5.6和redis3.2
环境:centos 6.8, docker version 1.7.1 1.docker安装mysql5.6 第一步:拉取镜像 docker pull mysql:5.6 第二步:docker run ...
- eclipse切换工作空间
- android 小音频频繁播放
android中多媒体文件(音乐和视频)的播放是用MediaPlayer方式是大家比较熟悉的,但是现在要来说一下另外一种音乐文件播放的方式SoundPool,相比较而言,用MediaPlayer来播放 ...
- es6字符串的扩展——模板
todo1.模板字符串 传统的 JavaScript 语言,输出模板通常是这样写的(下面使用了 jQuery 的方法). $('#result').append( 'There are <b&g ...
- nginx 与location语法详解
Location语法优先级排列 匹配符 匹配规则 优先级 = 精确匹配 1 ^~ 以某个字符串开头 2 ~ 区分大小写的正则匹配 3 ~* 不区分大小写的正则匹配 4 !~ 区分大小写不匹配的正则 ...
- mongo注解详解
1.@Entity如果你想通过Morphia把你的对象保存到Mongo中,你首先要做的是使用@Entity注解你的类:@Entity(value="comm_user_favorite_co ...
- NOIP考前知识点整理
前言:距离NOIP还有不到一百天(虽然NOIP没了),为了整理一下所学的内容,才有了这篇博文.本文内容无特殊说明全部来自于博主的博客,代码也都是新敲的,努力在个人的码风基础上做到尽量简洁,求资瓷. 一 ...
- WireShark简单使用以及TCP三次握手
最近一直在用C#编写服务器端的程序,苦于一直找不到合适的方法来测试网络程序,这篇文章很好的解释了网络程序的底层实现. WireShark是最好的学习网络协议最好的工具. wireshark介绍 wir ...