Java实现栈之计算器

简介: Java实现栈来做一个将中缀表达式转化为后缀表达式的程序,中缀表达式更符合我们的主观感受,后缀表达式更适合计算机的运算,下面直接上代码吧:package Character1;import 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;
        }
    }

}

下面就是程序的运行结果:

程序运行结果
由于时间匆忙,未来得及做注释,导致此程序可读性较差,还望读者取精华弃糟粕。也希望对我的书写中有错误的地方予以指正,旨在我们的共同进步!

目录
相关文章
|
5月前
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
160 4
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
63 5
|
2月前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
63 2
|
3月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
41 2
|
5月前
|
Java 索引
java中的栈(利用数组实现栈)
这篇文章通过Java代码示例介绍了如何使用数组实现栈操作,包括栈的初始化、入栈、出栈、判断栈满和空以及遍历栈的方法。
java中的栈(利用数组实现栈)
|
6月前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
75 2
|
6月前
|
存储 安全 Java
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
101 3
|
6月前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
67 0
|
6月前
|
存储 Java
JAVA程序运行问题之JVM 中的栈如何解决
JAVA程序运行问题之JVM 中的栈如何解决
|
6月前
|
存储 安全 Java
Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
总之,虽然在日常开发中,`java.util.Stack`正逐渐被其他类如 `Deque`接口的实现所取代,但手写一个栈(无论是基于数组还是链表)都是一次很好的编程练习,它可以帮助开发者更加深入地理解栈这种数据结构的工作原理和各种操作。
46 0