Rhythmli's blog Rhythmli's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Rhythmli

知识就是财富
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • Nodejs

  • 博客搭建

  • CSDN迁移

    • Spring IOC
    • Ngnix 阿里云
    • 最长回文子串
    • 面试题xuexixiexue
    • 哈希集合和哈希映射的简单设计
    • leetcode2021.11.03
    • Leetcode2021.11.2
    • JUC学习
    • 869. 重新排序得到 2 的幂
    • Java自动装箱拆箱
    • 55. 跳跃游戏
    • 剑指 Offer II 085. 生成匹配的括号
    • 300. 最长递增子序列
    • Java并发编程之美 01
    • 134. 加油站
    • 139. 单词拆分
    • 岛屿类问题题解
    • 138. 复制带随机指针的链表
    • 347. 前 K 个高频元素
    • 剑指 Offer II 026. 重排链表
    • 剑指 Offer II 025. 链表中的两数相加
    • 剑指 Offer II 014. 字符串中的变位词
    • 剑指 Offer II 010. 和为 k 的子数组
    • 剑指 Offer II 009. 乘积小于 K 的子数组
    • 剑指 Offer II 008. 和大于等于 target 的最短子数组
    • 剑指 Offer II 007. 数组中和为 0 的三个数
    • 剑指 Offer II 006. 排序数组中两个数字之和
    • 剑指 Offer II 002. 二进制加法
    • 129. 求根节点到叶节点数字之和
    • 113.路径总和 II
    • leetcode18. 四数之和
    • 编译OpenCV 以及 openc_contrib 提示缺少boostdesc_bgm.i文件出错的解决
    • fork()浅学习
    • SSM 增删改查
    • springmvc helloworld
    • Spring01 hello实验
    • 树的DFS和BFS
    • leetcode——二分法
    • Halo博客搭建
    • 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接---转载
    • opencv+python+OpenPose姿态实时识别
    • 03.KNN算法 李航统计学习方法
    • 02.感知机 李航统计学习方法
    • 01.最小二乘法拟合 李航统计学习方法
    • Pycharm atplotlib.pyplot图像不显示解决方法
    • 论文阅读01 SVM+kNN图像分类
    • Java简单实现计算器——用数组实现栈
      • Java简单实现计算器——用数组实现栈
    • 【剑指Offer3】无重复字符的最长子串
    • 【剑指Offer5】最长回文字符串
    • TF-IDF求取文本相似度
    • JAVA_day02
    • JAVA_day01
    • 递归产生回文数
    • 中国象棋QT登录注册以及悔棋功能
    • STM32F4学习笔记(基础介绍篇)
    • leetcode_04 递归,回溯与分治
    • leetcode03_贪心算法
    • leetcode01--链表
    • leetcode_02栈
    • Docker学习入门
    • C/C++编译与链接 程序员的自我修养:链接 装载和库
    • Nginx简单学习
    • JAVA网络编程
    • JVM初步学习
    • Spring简单学习
    • 标准项目格式
    • 设计模式中的几个原则
    • Redis和IDEA简单创建及增删改查
    • Mybatis快速入门01
    • Redis全程学习笔记(附带学习的视频教程)
    • QT入门学习中最基础的那些事儿
    • QT中文输出错误问题:C2001
    • OOP:面向对象编程
    • LINUX常用命令集合(待续)
    • 《C和指针》简单学习笔记
    • 二叉树,栈存储及遍历小程序
    • 数据结构简单学习笔记
    • 扑克牌
    • C++动态内存和智能指针
    • 设计模式之简单工厂模式
    • leetcode_01数组
    • 嵌入式Linux移植应用
    • LINUX 进程与线程 信号量 通信
  • 技术
  • CSDN迁移
梁山话事人
最新推荐文章2023-11-15
目录

Java简单实现计算器——用数组实现栈

原文链接:https://blog.csdn.net/qq_39355828/article/details/117414362 (opens new window)

# Java简单实现计算器——用数组实现栈

参考尚硅谷 数据结构视频

package DataStructures.stack;

import java.util.Scanner;

class ArrayStack2
{
    private int maxSize;//栈的容量
    private int[] stack;
    private int top=-1;
    public ArrayStack2(int maxSize)//初始化栈的大小
    {
        this.maxSize=maxSize;
        stack=new int[this.maxSize];
    }
    public boolean Full()//判断是否栈满
    {
        return top==maxSize-1;
    }
    public boolean Empty()
    {
        return top==-1;
    }
    //入栈
    public void push(int value)
    {
        if(Full()) {
            System.out.println("The stack is full!");
            return;
        }
        top++;
        stack[top]=value;
    }
    //出栈
    public int pop()
    {
        if(Empty())
        {
            System.out.println("The stack is empty!");
            return 0;
        }
        int temp=stack[top];
        top--;
        return temp;
    }
    //遍历栈
    public void displayStack()
    {
        if(Empty())
            System.out.println("The stack is empty!");
        int temp=top;
        for(int i=0;i<=temp;i++)
        {
            System.out.printf("stack[%d] %d\n",i,stack[i]);
            System.out.println("  ");
        }
    }
//返回栈顶
    public int peek()
    {
        return stack[top];
    }
    public int priority(char oper)
    {
        if(oper=='*'||oper=='/')//优先级比较高的操作符
        {
            return 1;
        }
        else if(oper=='+'||oper=='-')//优先级比较低的操作符
            return 0;
        else
            return -1;
    }
    //判断是不是一个运算符
    public boolean ioOrder(char val)
    {
        return val=='+'||val=='-'||val=='*'||val=='/';
    }
    //计算方法
    public int cal(int num1,int num2,int oper)
    {
        int res=0;
        switch(oper)
        {
            case'+':
                res=num1+num2;
                break;
            case'-':
                res=num2-num1;
                break;
            case'*':
                res=num1*num2;
                break;
            case'/':
                res=num2/num1;
                break;
            default:
                break;
        }
        return res;
    }

}
public class Calculator {
    public static void main(String[] args) {
        String exp="3+2*6-2";
        //创建两个栈,数栈,一个符号栈
        ArrayStack2 numStack=new ArrayStack2(10);
        ArrayStack2 operStack=new ArrayStack2(10);
        int index=0;//用于扫描
        int num1=0;
        int num2=0;
        int oper=0;
        int res=0;
        char ch=' ';
        while(true)
        {
            ch=exp.substring(index,index+1).charAt(0);
            System.out.println(ch);
            //判断ch是什么
            if(operStack.ioOrder(ch))
            {
                if(!operStack.Empty())
                {
                    //如果符号栈中有运算符 要比较
                    if(operStack.priority(ch)<=operStack.priority((char) operStack.peek()))
                    {
                        num1=numStack.pop();
                        num2=numStack.pop();
                        oper=operStack.pop();
                        res=numStack.cal(num1,num2,oper);
                        //运算结果加入数栈
                        numStack.push(res);
                        operStack.push(ch);
                    }
                    else
                    {
                        operStack.push(ch);
                    }
                }
                else
                {
                    operStack.push(ch);
                }
            }
            else
                numStack.push(ch-48);
            //判断是否扫描到最后
            index++;
            if(index>=exp.length())
            {
                break;
            }
        }
        while (true)//符号栈为空,数栈中只有一个数值
        {
            if(operStack.Empty())
                break;
            num1=numStack.pop();
            num2=numStack.pop();
            oper=operStack.pop();
            res=numStack.cal(num1,num2,oper);
            numStack.push(res);
        }
        System.out.printf("表达式结果%s =%d ",exp,numStack.pop());

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
编辑 (opens new window)
#JAVA#订阅专栏#查看详情
上次更新: 2026/08/11, 13:36:18
论文阅读01 SVM+kNN图像分类
【剑指Offer3】无重复字符的最长子串

← 论文阅读01 SVM+kNN图像分类 【剑指Offer3】无重复字符的最长子串→

最近更新
01
Spring IOC
03-31
02
Git修改分支名
08-11
03
CSS给table的tbody添加滚动条
06-29
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式