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实现栈之计算器的更多相关文章

  1. java技术栈:项目概述

    学习使用java到现在也有三年多了,这三年基本是以项目驱动的方式学习,有好有坏,个人觉得好处在于,有一个清晰的目标让你解决,这会让你学习非常迅速有效.当然坏处就是片面,不成体系.这种学习方式在学校以小 ...

  2. java applet初探之计算器

    这里是用java写的一个计算器,用appllet的方式在浏览器中运行,如果电脑上装有java运行环境jre就能一试.将html代码保存为*.html(名称能够自定),applettest编译为clas ...

  3. Ninja:Java全栈Web开发框架-Ninja中文网

    相信不少业界人士都还停留在SSh的时代 其实我想给大家推荐的一个轻量级框架那就是Ninja; Ninja是一个Java全栈Web开发框架,稳定.快速.非常高效. 商业价值 在你的下一个项目中,Ninj ...

  4. Java虚拟机栈和本地方法栈

    Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...

  5. 剑指Offer——Java实现栈和队列的互模拟操作

    剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入 ...

  6. Java技术栈思维导图

    Java技术栈思维导图 Java IO流体系 设计模式

  7. java 虚拟机栈

    与程序计数器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同.虚拟机栈描述的是Java执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口 ...

  8. 01.Java 开发简单的计算器

    难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...

  9. 20155301第十一周java课栈程序

    20155301第十一周java课栈程序 内容一:后序表达式: abcde/-f+ 内容二:根据填充以下代码: import java.util.Scanner; public class MyDCT ...

随机推荐

  1. 06 Nexus仓储/基础设施 - DevOps之路

    06 Nexus仓储/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi Nexus仓储官网简介: Th ...

  2. python中的printf:%号拼接字符串和format函数

    在C语言中,我们使用printf("%s","hello")这种形式进行字符串的拼接 在python中,进行这样的拼接有两种实现方式,分别是%号拼接以及使用fo ...

  3. 剑指架构师系列-MySQL常用SQL语句

    (1)分清HAVING与WHERE的区别: HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面.WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 G ...

  4. Go 语言变量作用域

    作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函数定义中的变量称为形式 ...

  5. Ruby方法参数默认值的一个小技巧在Rails中的应用

    我们需要生成一个gravatar格式的html.image标示,于是写了如下方法: def gravatar_for(user) gravatar_id = Digest::MD5::hexdiges ...

  6. android studio 转为eclipse快捷键后还存在的问题汇总

    提取局部变量:Ctrl+Alt+V 提取全局变量:Ctrl+Alt+F 提取方法:Shit+Alt+M 使用android studio 出现红色下划线代表有错误产生,eclipse中的Ctrl+1( ...

  7. 使用java操作HDFS

    新建Java Project; 1,右击项目,属性,Java Build Path,Libraries,Add External JARs(haddopp根目录下的所以jar): 2,做一下项目关联, ...

  8. MS Office2016留下的坑

    背景 问题源自论坛用户反馈,他用管家有几年了,之前使用IE都很正常,没有任何问题,但是最近突然发现,启动IE时,就会出现系统错误提示:无法启动此程序,因为计算机中丢失 api-ms-win-core- ...

  9. Scikit-learn:scikit-learn快速教程及实例

    http://blog.csdn.net/pipisorry/article/details/52251305 :7] y = dataset[:,8] 我们将在下面所有的例子里使用这个数据组,换言之 ...

  10. 剑指Offer——完美+今日头条笔试题+知识点总结

    剑指Offer--完美+今日头条笔试题+知识点总结 情景回顾 时间:2016.9.28 16:00-18:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:完美世界笔试 ...