数据结构之计算器的实现(JAVA)(四)
原理:
1.将中序表达式变化兴许表达式
2.当前字符为数字,将该数字放入栈中
3.当前字符为操作符,从栈中取出两个树,依据操作符来运算,将运算结果放入到栈中
4.反复,直到将字符操作完。此时栈中仅仅剩下一个元素,即要运算的结果
PS:我没有处理。仅仅能够执行10以内的运算,假设有须要能够扩展
package com.lip.datastructure.tree; import java.util.Iterator;
import java.util.Stack; public class Calculator
{ public static void main(String[] args)
{
String obj = "a*(b+c)+c/d";
String obj1 = "2*(1+3)+9/3"; System.out.println(obj1+"="+calculator(obj1)); }
//利用后序表达式计算
///原理:1.当期字符为字母或者数字,则直接入栈
// 2.当前字符为操作符则从栈中取出两个数字计算
// 3.将计算结果再放入到栈中,栈中最后剩余的一个元素就是要求的结果
public static int calculator(String obj)
{
String postObj=tranform(obj);
System.out.println();
Stack<Integer>stack=new Stack<Integer>();
for(int i=0;i<postObj.length();i++)
{
char ch=postObj.charAt(i);
if(Character.isLetterOrDigit(ch))//字符或者数字
{
stack.push(Integer.parseInt(ch+""));
}
else//操作符
{
//取出两个数
int op1,op2;
op1=stack.pop();
op2=stack.pop();
switch (ch)
{
case '+':
stack.push(op2+op1);
break;
case '-':
stack.push(op2-op1);
break;
case '*':
stack.push(op2*op1);
break;
case '/':
stack.push(op2/op1);
break;
default:
break;
}
}
}
return stack.pop();
}
// 中序遍历改为兴许遍历
public static String tranform(String obj)
{
Stack<Character> stack = new Stack<Character>();
String obj2 = "";
for (int i = 0; i < obj.length(); i++)
{
char ch = obj.charAt(i);
if (Character.isLetterOrDigit(ch))// 字母或数字直接输出
{
obj2 += ch;
System.out.print(ch);
} else if (ch == ')')// 在栈中一致匹配到)操作符才停止出栈
{
char temp;
while ((temp = stack.pop()) != '(')
{
obj2 += temp;
System.out.print(temp);
}
} else
// 比較操作符的进栈优先级
{
if (stack.isEmpty())
{
stack.push(ch);
continue;
}
char temp = stack.peek();
while (icp(ch) <= isp(temp))// 进栈优先级小于栈内优先级,则一直出栈
{
System.out.print(temp);
obj2 += temp;
stack.pop();
if (stack.isEmpty())
break;
temp = stack.peek();
}
stack.push(ch);
}
}
// 将栈中剩余的元素弹出来
while (!stack.isEmpty())
{
char temp = stack.pop();
obj2 += temp;
System.out.print(temp);
}
return obj2;
}
// 操作符在栈内的优先级
private static int isp(char ch)
{
switch (ch)
{
case '+':
case '-':
return 2;
case '*':
case '/':
return 4;
case ')':
return 7;
case '(':
return 1;
default:
break;
}
return 0;
} // 操作符进栈的优先级优先级
private static int icp(char ch)
{
switch (ch)
{
case '+':
case '-':
return 3;
case '*':
case '/':
return 5;
case ')':
return 1;
case '(':
return 7;
default:
break;
}
return 0;
} }
数据结构之计算器的实现(JAVA)(四)的更多相关文章
- 详细分析栈和队列的数据结构的实现过程(Java 实现)
目录 栈和队列的数据结构的实现过程(Java 实现) 栈的数据结构的实现 栈的基础知识回顾 栈的常见应用 基于数组的栈的实现 具体代码设计 基于数组的栈简单的时间复杂度分析 关于栈的一个算法应用:括号 ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
- Pascal、VB、C#、Java四种语法对照表
因为工作原因,自学会了vb后陆续接触了其它语言,在工作中经常需要与各家使用不同语言公司的开发人员做程序对接,初期特别需要一个各种语法的对照比,翻看了网络上已有高人做了整理,自己在他基础上也整理了一下, ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- (转载)new Thread的弊端及Java四种线程池的使用
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...
- 不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用
小结: 1.不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块. 2.垃圾收集器能决定是否一个对象还是可访问的:任何被确定不可访问的对象将会被释放. https://zh.w ...
- 20172301 2017-2018-2 《程序设计与数据结构》实验一《Java开发环境的熟悉》实验报告
20172301 2017-2018-2 <程序设计与数据结构>实验一<Java开发环境的熟悉>实验报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 郭 ...
- 线程池是什么?Java四种线程池的使用介绍
使用线程池的好处有很多,比如节省系统资源的开销,节省创建和销毁线程的时间等,当我们需要处理的任务较多时,就可以使用线程池,可能还有很多用户不知道Java线程池如何使用?下面小编给大家分享Java四种线 ...
随机推荐
- SetCapture ReleaseCapture
函数功能:该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕获鼠标.假设鼠标光标在还有一个线程创建的窗体 ...
- BI中事实表和维度表的定义
一个典型的样例是,把逻辑业务比作一个立方体,产品维.时间维.地点维分别作为不同的坐标轴,而坐标轴的交点就是一个详细的事实.也就是说事实表是多个维度表的一个交点.而维度表是分析事实的一个窗体. 首先介绍 ...
- UDP 通信
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public ...
- cocos2dX 之CCParticle
今天我们来看看粒子特效, 何为粒子特效, 为了模拟燃烧的火焰, 天空飘下来的血环, 滴落的小雨, 这些无规律变化的物体, 我们引进了粒子特效这个名词, 粒子特效的原理是将无数的单个粒子组合使其呈现出固 ...
- POJ--3268--Silver Cow Party【SPFA+邻接表】
题意:一些牛要去某一点參加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少须要花费多长时间. 思路:从聚会地点返回,相当于是从某一点到其它各个点的最短路径.从牛的家中走到聚会地点,能够把 ...
- DOM的event对象的属性和方法
属性/方法 类型 是否可读写 描写叙述 altKey Boolean 读写 指示是否按下alt键 bubbles Boolean 读 指示事件是否冒泡 button Intrger 读写 鼠标事件发生 ...
- HDU1300DP
/* HDU1300 DP 特定n饰品种类 每个饰品的两个数据.amount[i]代表数量.price[i]代表单位价格 购买珠宝时要满足下面购买规则: 单独买:每种珠宝要加上数量10 合并买:能够把 ...
- Enum实现单例模式
package com.wjy.effective; public enum Singleton { INSTANCE; private int numa; private int numb; pub ...
- Spring3.0官网文档学习笔记(七)--3.4.2
3.4.2 依赖与配置的细节 3.4.2.1 Straight values (primitives, Strings, and so on) JavaBeans PropertyE ...
- 服务器编程入门(4)Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字( ...