Java实现栈之计算器
Java实现栈来做一个将中缀表达式转化为后缀表达式的程序,中缀表达式更符合我们的主观感受,后缀表达式更适合计算机的运算,下面直接上代码吧:
package Character1;
import java.util.Stack;
public class Calculter {
private static Stack<Object> shu = new Stack<Object>();
private static Stack<Object> fu = new Stack<Object>();
static String oldString = "(1+2)+2*(4-1)+6/3";
public static void main(String[] args) {
char[] chars = new char[oldString.length()];
for (int i = 0; i < oldString.length(); i++) {
chars[i] = oldString.charAt(i);
}
for (int i = 0; i < chars.length; i++) {
if (isCaoZuoFu(chars[i])) {
if (chars[i] == '(') {
fu.add(chars[i]);
}
if (chars[i] == ')') {
// System.out.println(fu);
while ((char) fu.peek() != '(') {
shu.add(fu.pop());
}
if ((char) fu.peek() == '(') {
fu.pop();
}
// System.out.println(fu+"-----");
while (fu.isEmpty() != true) {
char temp = (char) fu.pop();
fu.add(temp);
if (temp == '*' || temp == '/') {
shu.add(temp);
fu.pop();
} else {
break;
}
}
} else if (chars[i] == '*') {
fu.add(chars[i]);
} else if (chars[i] == '/') {
fu.add(chars[i]);
} else if (chars[i] == '+') {
fu.add(chars[i]);
} else if (chars[i] == '-') {
fu.add(chars[i]);
}
} else {
shu.add(chars[i]);
}
}
// System.out.println(fu.toString());
// System.out.println(shu.toString());
System.out.println("原字符串是:"+oldString);
System.out.println("------------------以上部分千万不要改动了");
while(fu.isEmpty()!=true){
shu.add(fu.pop());
}
System.out.println("操作符栈:"+fu.toString());
System.out.println("操作数栈:"+shu.toString());
System.out.println("----------------------中缀表达式转换为后缀表达式的结果!");
int result=JiSuan(Reverse(shu));
System.out.println("表达式最终答案:"+result);
}
public static int JiSuan(Stack<Object> stack){
int result=0;
Stack<Object>temp=new Stack<Object>();//存放后缀表达式的操作数的栈
while(stack.isEmpty()!=true){
if(!isCaoZuoFu((char)stack.peek())){
temp.add(stack.pop());
System.out.println(temp);
}else{
int o1=Integer.parseInt(temp.pop().toString());
int o2=Integer.parseInt(temp.pop().toString());
if(stack.isEmpty()!=true){
if((char)stack.peek()=='+'){
temp.add(o2+o1);
}
if((char)stack.peek()=='-'){
temp.add(o2-o1);
}
if((char)stack.peek()=='*'){
temp.add(o2*o1);
}
if((char)stack.peek()=='/'){
temp.add(o2/o1);
}
stack.pop();
}
}
}
return (int) temp.peek();
}
public static Stack<Object> Reverse(Stack<Object> shu){
Stack<Object> reverseStack=new Stack<Object>();
while(shu.isEmpty()!=true){
reverseStack.add(shu.pop());
}
System.out.println("来个反序:"+reverseStack);
return reverseStack;
}
//此方法用于判断对应字符是不是操作符,其中case的数字是对应的ASCII码。
public static boolean isCaoZuoFu(char b) {
int temp = (char) b;
switch (temp) {
case 43:
case 45:
case 42:
case 47:
case 40:
case 41:
return true;
default:
return false;
}
}
}
下面就是程序的运行结果:
由于时间匆忙,未来得及做注释,导致此程序可读性较差,还望读者取精华弃糟粕。也希望对我的书写中有错误的地方予以指正,旨在我们的共同进步!
Java实现栈之计算器的更多相关文章
- java技术栈:项目概述
学习使用java到现在也有三年多了,这三年基本是以项目驱动的方式学习,有好有坏,个人觉得好处在于,有一个清晰的目标让你解决,这会让你学习非常迅速有效.当然坏处就是片面,不成体系.这种学习方式在学校以小 ...
- java applet初探之计算器
这里是用java写的一个计算器,用appllet的方式在浏览器中运行,如果电脑上装有java运行环境jre就能一试.将html代码保存为*.html(名称能够自定),applettest编译为clas ...
- Ninja:Java全栈Web开发框架-Ninja中文网
相信不少业界人士都还停留在SSh的时代 其实我想给大家推荐的一个轻量级框架那就是Ninja; Ninja是一个Java全栈Web开发框架,稳定.快速.非常高效. 商业价值 在你的下一个项目中,Ninj ...
- Java虚拟机栈和本地方法栈
Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...
- 剑指Offer——Java实现栈和队列的互模拟操作
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列 题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 思路:其实就是把队列正常入 ...
- Java技术栈思维导图
Java技术栈思维导图 Java IO流体系 设计模式
- java 虚拟机栈
与程序计数器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同.虚拟机栈描述的是Java执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口 ...
- 01.Java 开发简单的计算器
难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...
- 20155301第十一周java课栈程序
20155301第十一周java课栈程序 内容一:后序表达式: abcde/-f+ 内容二:根据填充以下代码: import java.util.Scanner; public class MyDCT ...
随机推荐
- pycharm 安装与基本设置
一.下载及安装 打开官网下载:https://www.jetbrains.com/pycharm/download/#section=windows 下载完毕之后可直接双击可执行文件,然后点击&quo ...
- C++格式化输出浮点数
主要内容 介绍C++中如何格式化输出浮点数. 控制浮点数输出格式需要包含iomanip头文件. 使用fixed来控制输出的浮点数的小数位是固定的.可参考http://en.cppreference.c ...
- Java中常用缓存Cache机制的实现
缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例. 这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件 ...
- Java中获取文件大小的正确方法
本文出处:http://blog.csdn.net/djy1992/article/details/51146837,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在原始 ...
- python 3.3.3 字面量,正则,反斜杠和原始字符串
两个不起眼但是比较重要的设定 Python str类型的字面量解释器 当反斜杠及其紧接字符无法构成一个具有特殊含义的序列('recognized escape sequences')时,Python选 ...
- spark运算结果写入hbase及优化
在Spark中利用map-reduce或者spark sql分析了数据之后,我们需要将结果写入外部文件系统. 本文,以向Hbase中写数据,为例,说一下,Spark怎么向Hbase中写数据. 首先,需 ...
- 为什么选择C++
为什么选择C++,怎么不选其它语言呢? 为什么不选择C? 因为C++比C简单点~ 为什么不选择C#? 因为C++可以在所有操作系统上使用. 为什么不选择JAVA? 因为C++的性能好一点~ 还有其他的 ...
- Xcode7.3.1中通过最新的CocoaPod安装pop动画引擎
CocoaPod是一个用ruby实现,用于方便的管理Xcode中第三方插件的管理器.用它我们可以很方便的安装和升级插件而不用担心破坏原有的项目. 而pop是一个用于实现App中动画的引擎,它是由Fac ...
- 一个 Linux 上分析死锁的简单方法
简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...
- 设置TextView显示的文字可以复制
设置TextView显示的文字可以复制 效果图 在xml中设置 <TextView android:layout_width="wrap_content" android:l ...