栈的官方概念 栈是java存放内存的两种结构之一。栈是限定仅在表尾进行插入或删除操作的线形表。

通俗的讲,往栈里面存数据,就是先进后出。最先存入的数据在最底部,取出的时候最后被取出。可以理解为吃饱了就吐.

在Java里面根据栈的这种概念提供了一个Stack类和相关的方法,可以很容易的实现栈的这些特性。

下面是几个主要特性的方法:

isEmpty(): 测试堆栈是否为空。

search(): 返回指定对象在堆栈中的位置。

firstElement(): 查看堆栈中最底部的对象。

peek(): 查看堆栈中最顶部的对象。

pop(): 移除堆栈中最顶部的对象,并返回该对象。

通过代码简单测试一下这几个方法

package _3_5_test;

import java.util.Iterator;

import java.util.Stack;

public class SeventyThreeTest {

public static void main(String[] args) {

// TODO Auto-generated method stub

Stack stack = new Stack<>();

boolean flag1 = stack.isEmpty();

System.out.println("未添加数据前,对栈是否为空进行判断:"+flag1);

//向栈中存入数据

for(int i=0;i<10;i++) {

stack.push(i+1);

}

//查看栈中的所有对象

Iterator iterator = stack.iterator();

System.out.print("栈中所有对象:");

while (iterator.hasNext()) {

System.out.print(iterator.next()+" ");

}

System.out.println();

int index = stack.search(2);

System.out.println("返回对象2在栈中的位置:"+index);

int bottom = stack.firstElement();

System.out.println("查看栈底部的对象:"+bottom);

int peek1 = stack.peek();

System.out.println("查看栈顶部的对象(不从栈中移除):"+peek1);

int pop1 = stack.pop();

System.out.println("移除栈顶部的对象,并返回该对象:"+pop1);

int peek2 = stack.peek();

System.out.println("重新查看栈顶部的对象(不从栈中移除):"+peek2);

boolean flag2 = stack.isEmpty();

System.out.println("添加数据后,对栈是否为空进行判断:"+flag2);

}

}

实现效果

堆栈的实际应用

看概念不知道堆栈有什么用,做个题目就可以很直观的看出堆栈的作用了。

对表达式的计算是堆栈的经典应用

题目要求:

package _3_5_test;

import java.util.Scanner;

import java.util.Stack;

/*表达式计算

* 先分割表达式,根据运算符号进行分割

* 有乘除的先进行运算

* 有括号的先进行运算

* */

public class SeventyThree {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner scanner = new Scanner(System.in);

String s = scanner.nextLine();

Stack nums = new Stack(); // 保存数字

Stack opes = new Stack(); // 保存操作符

// 将字符串转换成字符数组,便于后面进行遍历操作

char cs[] = s.toCharArray();

// 用于存放数字

int n = 0;

// 遍历一遍字符串中所有的字符:分为以下几种情况进行处理

for (int i = 0; i < cs.length; i++) {

char temp = cs[i];

if (Character.isDigit(temp)) {// 如果当前的字符是数字,存入n中,要考虑大于10的数字的进位情况

n = n * 10 + Integer.parseInt(String.valueOf(temp));

} else {// 如果当前的字符不是数字,进行字符判断,区分是四则运算符号还是括号

if (n != 0) {// 如果n不等于0,说明已经取了运算符号左边的值,将这个值放进栈中

nums.push(n);

n = 0;

}

if (temp == '(') {// 如果当前字符是左括号,将字符存入栈中,再取下一个字符

opes.push(temp);

} else if (temp == ')') {// 计算括号中的内容

while (opes.peek() != '(') {

// 从数字栈和操作符栈取出顶部的值,进行运算,并将最终结果存进数字栈中

int t = cal(nums.pop(), nums.pop(), opes.pop());

nums.push(t);

}

opes.pop();//括号内运算完毕,取出左括号

} else if (pre(temp) > 0) {// 如果当前符号是四则运算符

if (opes.isEmpty()) {// 如果当前的符号栈中没有运算符号,则将当前的预算符号直接加进栈中

opes.push(temp);

} else {// 如果栈中已经存在的运算符号,则要进行优先级的判断

if (pre(opes.peek()) >= pre(temp)) {

int t = cal(nums.pop(), nums.pop(), opes.pop());

nums.push(t);

}

opes.push(temp);

}

}

}

}

if (n != 0) {

nums.push(n);

}

while (!opes.isEmpty()) {

int t = cal(nums.pop(), nums.pop(), opes.pop());

nums.push(t);

}

System.out.println(nums.pop());

}

// 自定义一个符号优先级判断方法

public static int pre(Character c) {

if (c == '+' || c == '-') {

return 1;

} else if (c == '*' || c == '/') {

return 2;

} else {

return 0;

}

}

// 自定义一个四则运算方法,因为栈先进后出的特性,所以b是在前面的数值,a是在后面的数值

public static int cal(int a, int b, Character sign) {

switch (sign) {

case '+':

return b + a;

case '-':

return b - a;

case '*':

return b * a;

case '/':

return b / a;

}

return 0;

}

}

java堆栈类在哪个包里_Java堆栈Stack类的使用相关推荐

  1. java中迭代器要导包吗_java 中迭代器的使用方法详解

    java 中迭代器的使用方法详解 前言: 迭代器模式将一个集合给封装起来,主要是为用户提供了一种遍历其内部元素的方式.迭代器模式有两个优点:①提供给用户一个遍历的方式,而没有暴露其内部实现细节:②把元 ...

  2. java中random方法取值范围_java的Random类详解

    Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...

  3. php 类 单例,PHP里的单例类写法实例

    PHP里的单实例类在进行数据交换,节省内存上还是很有意义的.写个简单例子. 类1,单实例类本身: class UTIL { private static $instance; public funct ...

  4. Java Spring初学者之调试器里括号包含的类含义

    如图: 表示在执行类的构造函数. 圆括号里代表执行的构造函数是定义在哪个实际类里的: 从继承树可以看出,ClassPathXmlApplicationContext最终的父类为AbstractAppl ...

  5. java一个类添加多个接口_Java的一个类可以实现多个接口。

    Java的一个类可以实现多个接口. 答:√ 下列原始凭证中属于一次凭证的有( ). 答: 收据 收料单 完全角化细胞在显微镜下不可能出现的颜色是 答:白色 In a language classroo ...

  6. java普通类方法的区别是什么_java – 普通接口类和只有抽象方法的抽象类之间有什么区别吗?...

    是的,他们是不同的. 通过接口,客户端可以实现它以及扩展类: class ClientType implements YourInterface, SomeOtherInterface { //can ...

  7. java解析上的jar包里的pom_Maven引入本地Jar包并打包进War包中的方法

    1.概述 在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来. 2. 拷贝至项目根目录 项目根目录即pom.xml文件所在的同级目录,可以 ...

  8. java时间往后延后一年_java中时间类(util Date)的后延与前推处理

    当后延或者前推的天数在一定时间之内时,可以用以下方法处理 public static Date  getValidEndTime(Date date,int validDayCount){ Simpl ...

  9. 工具类的方法怎么引用_Java实用工具类:File工具类方法学习,可创建目录及文件...

    开发项目过程中,会用到很多工具类,今天分享一个Java中File操作工具类,可以帮你节约时间,提高开发效率. File工具类 public class CreateFileUtil { public ...

最新文章

  1. dfmea文件_PFMEA执行之步骤七:结果文件化 vs 高层管理者的承诺
  2. Android NDK开发Crash错误定位[转]
  3. Windows下运行jekyll,编码已不再是问题
  4. bzoj1051[kosaraju算法]求强连通分量
  5. Tomcat9版本不支持jsp处理PUT,DELETE之外的请求的解决方案(405方法不允许)
  6. 暴风影音2009开机启动关闭方法
  7. mysql1682错误_ERROR 1682 (HY000)
  8. java 数独算法_Java:递归数独解法计数算法
  9. 跟我学在高德地图——标注我的位置
  10. Hibernate框架基础——cascade属性
  11. 四.电影/综艺网站(包含搜索经验, 我的经验, 必看) 彻底帮你解决看电影/综艺的问题
  12. Openstack Zoning – Region/Availability Zone/Host Aggregate
  13. 如何识别液晶屏面板的型号及品牌
  14. 数据库查询中的n+1问题
  15. [转]作为黑客的你应该拥有的10个小工具
  16. DOM4j解析XMl中碰到的问题解决
  17. CC2640R2F的各个驱动文件放在哪里比较好
  18. geoip 注册_【注册】饲料添加剂巴基斯坦注册简介
  19. app式成语_abcc的成语c-abcc的成语c式词语大全app安卓版v12.12.2下载-SLY软件园
  20. 修改文件与文件提交--乐字节Java

热门文章

  1. 使用HttpClient发送WebService Security(WSS)请求
  2. 2020年Java实训项目【GUI学生信息管理系统】目录
  3. Java讲课笔记23:Map接口及其实现类
  4. string类比较大小_源码阅读String--JAVA成长之路
  5. 2017.3.5 yveh测试
  6. 【英语学习】【Level 07】U06 First Time L6 Not your typical experience
  7. 【英语学习】【WOTD】Parthian 释义/词源/示例
  8. linux下查看中断请求记录 IRQ
  9. UE4在VS2013中各个编译配置代表意义
  10. 安卓-08-布局管理器