和C++一样,JDK包中也提供了"栈"的实现,它就是集合框架中的Stack类。关于Stack类的原理,在"Java 集合系列07之 Stack详细介绍(源码解析)和使用示例"中,已经详细介绍过了。本部分给出2种Java实现
Java实现一:数组实现的栈,能存储任意类型的数据。
Java实现二:Java的 Collection集合 中自带的"栈"(stack)的示例。

1. Java实现一:数组实现的栈,能存储任意类型的数据

实现代码:

  1. /**
  2. * Java : 数组实现的栈,能存储任意类型的数据
  3. *
  4. * @author skywang
  5. * @date 2013/11/07
  6. */
  7. import java.lang.reflect.Array;
  8.  
  9. public class GeneralArrayStack<T> {
  10.  
  11. private static final int DEFAULT_SIZE = 12;
  12. private T[] mArray;
  13. private int count;
  14.  
  15. public GeneralArrayStack(Class<T> type) {
  16. this(type, DEFAULT_SIZE);
  17. }
  18.  
  19. public GeneralArrayStack(Class<T> type, int size) {
  20. // 不能直接使用mArray = new T[DEFAULT_SIZE];
  21. mArray = (T[]) Array.newInstance(type, size);
  22. count = 0;
  23. }
  24.  
  25. // 将val添加到栈中
  26. public void push(T val) {
  27. mArray[count++] = val;
  28. }
  29.  
  30. // 返回“栈顶元素值”
  31. public T peek() {
  32. return mArray[count-1];
  33. }
  34.  
  35. // 返回“栈顶元素值”,并删除“栈顶元素”
  36. public T pop() {
  37. T ret = mArray[count-1];
  38. count--;
  39. return ret;
  40. }
  41.  
  42. // 返回“栈”的大小
  43. public int size() {
  44. return count;
  45. }
  46.  
  47. // 返回“栈”是否为空
  48. public boolean isEmpty() {
  49. return size()==0;
  50. }
  51.  
  52. // 打印“栈”
  53. public void PrintArrayStack() {
  54. if (isEmpty()) {
  55. System.out.printf("stack is Empty\n");
  56. }
  57.  
  58. System.out.printf("stack size()=%d\n", size());
  59.  
  60. int i=size()-1;
  61. while (i>=0) {
  62. System.out.println(mArray[i]);
  63. i--;
  64. }
  65. }
  66.  
  67. public static void main(String[] args) {
  68. String tmp;
  69. GeneralArrayStack<String> astack = new GeneralArrayStack<String>(String.class);
  70.  
  71. // 将10, 20, 30 依次推入栈中
  72. astack.push("10");
  73. astack.push("20");
  74. astack.push("30");
  75.  
  76. // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
  77. tmp = astack.pop();
  78. System.out.println("tmp="+tmp);
  79.  
  80. // 只将“栈顶”赋值给tmp,不删除该元素.
  81. tmp = astack.peek();
  82. System.out.println("tmp="+tmp);
  83.  
  84. astack.push("40");
  85. astack.PrintArrayStack(); // 打印栈
  86. }
  87. }

结果说明:GeneralArrayStack是通过数组实现的栈,而且GeneralArrayStack中使用到了泛型。

2. Java实现二:Java的 Collection集合 中自带的"栈"(stack)的示例

  1. import java.util.Stack;
  2.  
  3. /**
  4. * Java : java集合包中的Stack的演示程序
  5. *
  6. * @author skywang
  7. * @date 2013/11/07
  8. */
  9. public class StackTest {
  10.  
  11. public static void main(String[] args) {
  12. int tmp=0;
  13. Stack<Integer> astack = new Stack<Integer>();
  14.  
  15. // 将10, 20, 30 依次推入栈中
  16. astack.push(10);
  17. astack.push(20);
  18. astack.push(30);
  19.  
  20. // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
  21. tmp = astack.pop();
  22. //System.out.printf("tmp=%d\n", tmp);
  23.  
  24. // 只将“栈顶”赋值给tmp,不删除该元素.
  25. tmp = (int)astack.peek();
  26. //System.out.printf("tmp=%d\n", tmp);
  27.  
  28. astack.push(40);
  29. while(!astack.empty()) {
  30. tmp = (int)astack.pop();
  31. System.out.printf("tmp=%d\n", tmp);
  32. }
  33. }
  34. }

本文来自http://www.cnblogs.com/skywang12345/p/3562239.html

栈的实现——java的更多相关文章

  1. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  2. 栈的实现(JAVA)

    栈定义 栈(stack):是一种特殊的串行形式的数据结构,其特殊之处在于只允许在链接串行或者阵列的 一端进行插入.删除操作.其实现方式可以通过一维阵列和链接串行来实现. Tips:简单的来说栈其实也是 ...

  3. 栈的实现Java

    package practice; import java.util.Iterator; //栈 public class MyStack<T> implements Iterable&l ...

  4. 剑指offer【05】- 用两个栈实现队列(java)

    题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保 ...

  5. 数组、栈、堆(java基础知识五)

    1.数组概述.定义格式 * A:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. * B:数组定义格式 格式1:数据类型[ ...

  6. java虚拟机栈(关于java虚拟机内存的那些事)

    <深入理解 java 虚拟机> 读书扩展 作者:淮左白衣 写于 2018年4月13日16:26:51 目录 文章目录 java虚拟机栈是什么 特点 栈帧 局部变量表 什么时候抛出 `Sta ...

  7. 05.用两个栈实现队列 Java

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 进栈: 直接进stack1 出栈: 若stack2不为空,则出栈. 否则,当stack1不为空时, ...

  8. (超详细)动手编写 — 栈、队列 ( Java实现 )

    目录 前言 栈 概念 栈的设计 编码实现 小结 队列 概念 队列的设计 编码实现 双端队列 概念 设计 编码 循环队列 循环队列 循环双端队列 声明 前言 栈 概念 什么是栈? **栈 **:是一种特 ...

  9. 数据结构之链表、栈和队列 java代码实现

    定义抽象节点类Node: package cn.wzbrilliant.datastructure; /** * 节点 * @author ice * */ public abstract class ...

随机推荐

  1. Nginx+Keepalived实现站点高可用[z]

    http://segmentfault.com/a/1190000002881132

  2. OpenGLES.gpus_ReturnNotPermittedKillClient

    在iOS中,使用OpenGLES不当引起的crash:“gpus_ReturnNotPermittedKillClient” https://developer.apple.com/library/i ...

  3. Web前端工程师常去的15个技术网站

    1.CSDN 网址:https://www.csdn.net/ 简介: CSDN (Chinese Software Developer Network) 创立于1999年,是中国最大的IT社区和服务 ...

  4. Mysql 查看表结构的命令

    创建数据库create database abc; 显示数据库 show databases; 使用数据库 use 数据库名; 直接打开数据库 mysql -h localhost -u root - ...

  5. msys2 启用windows PATH环境变量

    有三种方法修改 ①msys2_shell.cmd 中取消一行的注释:set MSYS2_PATH_TYPE=inherit ②调用msys2_shell.cmd时使用-use-full-path参数 ...

  6. 针对程序员的podcast

    身为程序员们,必须要懂得合理的利用琐碎时间来提炼自身,或许上下班途中或骑行或徒步或...时,以下这些Podcasts对你有些许作用: The Hanselminutes podcast by Scot ...

  7. KBMMW 4.6 正式版发布

    喜大普奔迎新年! Merry Christmas! We are happy to announce the release of kbmMW v. 4.60.00 Professional and ...

  8. 浅谈OCR之Tesseract

    光 学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷.打印 ...

  9. nodejs中使用mongodb quickstart

    nodejs中使用mongodb quickstart node 中使用mongodb的quick start.整理的官网crud简单例子. 在百度找了几篇帖子都有问题,所以直接看官网了. 连接Mon ...

  10. PAT甲 1011. World Cup Betting (20) 2016-09-09 23:06 18人阅读 评论(0) 收藏

    1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...