方法:

1.将string类型的表达式输入转换成后缀表达式

2.计算后缀表达式

步骤一:将string类型的表达式输入转换成后缀表达式

输入字符串表达式,并将表达式转换成char型数组

String a = "(5+5)*2-(4-2)/2";
char [] x = a.toCharArray();
Stack<Character> b = new Stack<>();
String back = "";//后缀表达式

后缀表达式实现

1. 遇到”(“时进栈

2. 遇到数字,将数字加入back字符串后面

3. 遇到”+“、”-“、”*“、”/“时,判断栈顶元素的优先级是否高于或等于该元素,如果是则依次出栈加入back直到栈顶元素优先级小于该元素,该元素进栈

4. 遇到”)“时,栈顶元素依次出栈直到栈顶为”(“,删除栈顶”(“元素

for (int i = 0; i <x.length; i++) {
//System.out.println(back);
if(x[i] == '(') b.push(x[i]);
if(x[i] == '+' || x[i] == '-') {
while(!b.isEmpty() && (b.peek() == '*' || b.peek() == '/')) {
back = back + b.peek();
b.pop();
}
b.push(x[i]);
}
if(x[i] == '*' || x[i] == '/') {
while(!b.isEmpty() && (b.peek() == '*' || b.peek() == '/')) {
back = back + b.peek();
b.pop();
}
b.push(x[i]);
}
if(x[i] == ')') {
while (!b.isEmpty()){
if(b.peek() == '(') {b.pop(); break;}
//System.out.println(back);
back = back + b.peek();
b.pop();
}
}
if(x[i] >= '0' && x[i] <= '9') back = back + x[i];
}
while(!b.isEmpty()){
back += b.peek();
b.pop();
}
System.out.println(back); 

步骤二:计算后缀表达式

1. 遇到数字则进栈

2. 遇到运算符时,取出栈顶两个元素进行计算

3. 直到栈为空

Stack<Double> bb = new Stack<>();
double p,q;
char [] xx = back.toCharArray();
for (int i = 0; i < xx.length; i++) {
if(xx[i] >= '0' && xx[i] <= '9') {
double s = (double) xx[i] - 48;
//System.out.println(s);
bb.push(s);
//System.out.println(xx[i] - 48);
}
if(xx[i] == '+'){
p = bb.peek();
bb.pop();
q = bb.peek();
bb.pop();
double result = p+q;
bb.push(result);
//System.out.println(result);
}
if(xx[i] == '-'){
p = bb.peek();
bb.pop();
q = bb.peek();
bb.pop();
double result = q-p;
bb.push(result);
//System.out.println(result);
}
if(xx[i] == '*'){
p = bb.peek();
bb.pop();
q = bb.peek();
bb.pop();
double result = p*q;
bb.push(result);
//System.out.println(result);
}
if(xx[i] == '/'){
p = bb.peek();
bb.pop();
q = bb.peek();
bb.pop();
double result = q/p;
bb.push(result);
//System.out.println(result);
}
}
int aaa = bb.peek().intValue();
System.out.println(aaa);

优势与局限

1. 该方法解决了优先级高无括号的问题

2. 该方法解决了除法生成小数的问题

3. 该方法仅限于0-9的简单计算

4. 该方法输入仅限于整数

声明:在十位数或以上的简单计算或是小数的简单计算上,如有好的方法告知

基于java的简易计算器实现的更多相关文章

  1. 基于Java的简易表达式解析工具(一)

    最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...

  2. 基于Java的简易表达式解析工具(二)

    之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...

  3. 基于Andriod的简易计算器

    这学期有安卓这门课,这里做了一个简易的计算器,实现了两位数加减乘除的基本功能,比较简单适合用来入门学习. 运行效果 预备知识 实现这个计算器之前要先了解实现计算器需要的基本组件 1.TextView ...

  4. Java实现简易计算器

    import java.util.Scanner; public class Demo_1 { public static void main(String[] args) { //输入的两个数字进行 ...

  5. java基础——简易计算器的实现

    计算器: import java.util.Scanner;​public class CalculateDemo {    public static void main(String[] args ...

  6. java开发简易计算器

    所选用的编译工具为NetBeans /* * To change this license header, choose License Headers in Project Properties. ...

  7. 基于c的简易计算器二

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> ...

  8. 基于c的简易计算器一

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h&g ...

  9. 如何使用Java AWT 创建一个简易计算器

    摘要:手把手教你使用 Java AWT 创建一个简易计算器. 本文分享自华为云社区<手把手教你使用 Java AWT 创建一个简易计算器>,作者:海拥 . 关于AWT AWT (抽象窗口工 ...

随机推荐

  1. js中map和python中的map

    js 中的map: 由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow( ...

  2. static修饰java内部运行顺序

    package com.demo01; public class Static extends demo{ /** * @param args */ private static String str ...

  3. Maven pom.xml 常用打包配置

    <build> <!-- 指定JAVA源文件目录 --> <sourceDirectory>src</sourceDirectory> <!-- ...

  4. 配置centos7 网卡

    进入root模式,输入 cd /etc/sysconfig/network-scripts/ 按Tab键查看网卡配置文件名称,然后进入编辑: 如: cd /etc/sysconfig/network- ...

  5. python SQLAchemy外键关联

    join 1.利用filter import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarati ...

  6. ES6学习笔记(一)

    ‘变量’声明 ES6新增两个声明’变量’的关键字,let和const命令. l  let用来声明局部变量 同ES5中var声明的变量不同的是,let声明的变量的作用域范围仅仅是从其声明的地方开始,到其 ...

  7. 使用C++11新特性来实现RAII进行资源管理

    方法一:借助auto.decltype.unique_ptr.Lambda表达式构造 sqlite3 *db = NULL; auto deleter = [](sqlite3 *pdb){sqlit ...

  8. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  9. linux 文件常用操作

    linux 文件基本操作 新建文件:touch test 不会替换重名文件,并且linux一切都是文件,文件夹和文件不能重名 新建文件夹:mkdir test使用 -p 参数,同时创建父目录(如果不存 ...

  10. Linux ->> UBuntu 14.04 LTE下安装Hadoop 1.2.1(伪分布模式)

    Hadoop的运行模式可分为单机模式.伪分布模式和分布模式. 首先无论哪种模式都需要安装JDK的,这一步之前的随笔Ubuntu 14.04 LTE下安装JDK 1.8中已经做了.这里就不多说了. 其次 ...