近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。

实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线性栈和链式栈,代码比较简单,如下:

  1. package com.peter.java.dsa.interfaces;
  2.  
  3. /**
  4. * 栈操作定义
  5. *
  6. * @author Peter Pan
  7. */
  8.  
  9. public interface Stack<T> {
  10. /* 判空 */
  11. boolean isEmpty();
  12.  
  13. /* 清空栈 */
  14. void clear();
  15.  
  16. /* 弹栈 */
  17. T pop();
  18.  
  19. /* 入栈 */
  20. boolean push(T data);
  21.  
  22. /* 栈的长度 */
  23. int length();
  24.  
  25. /* 查看栈顶的元素,但不移除它 */
  26. T peek();
  27.  
  28. /* 返回对象在栈中的位置 */
  29. int search(T data);
  30. }

线性栈:以数组的方式实现。

  1. package com.peter.java.dsa.common;
  2.  
  3. import com.peter.java.dsa.interfaces.Stack;
  4.  
  5. /**
  6. * 线性栈
  7. *
  8. * @author Peter Pan
  9. */
  10. public class LinearStack<T> implements Stack<T> {
  11. @SuppressWarnings("unchecked")
  12. private T[] t = (T[]) new Object[16];
  13. private int size = 0;
  14.  
  15. @Override
  16. public boolean isEmpty() {
  17. // TODO Auto-generated method stub
  18. return size == 0;
  19. }
  20.  
  21. @Override
  22. public void clear() {
  23. // TODO Auto-generated method stub
  24. for (int i = 0; i < t.length; i++) {
  25. t[i] = null;
  26. }
  27. size = 0;
  28. }
  29.  
  30. @Override
  31. public T pop() {
  32. // TODO Auto-generated method stub
  33. if (size == 0) {
  34. return null;
  35. }
  36. T tmp = t[size - 1];
  37. t[size - 1] = null;
  38. size--;
  39. return tmp;
  40. }
  41.  
  42. @Override
  43. public boolean push(T data) {
  44. // TODO Auto-generated method stub
  45. if (size >= t.length) {
  46. resize();
  47. }
  48. t[size++] = data;
  49. return true;
  50. }
  51.  
  52. @Override
  53. public int length() {
  54. // TODO Auto-generated method stub
  55. return size;
  56. }
  57.  
  58. @Override
  59. public T peek() {
  60. // TODO Auto-generated method stub
  61. if (size == 0) {
  62. return null;
  63. } else {
  64. return t[size - 1];
  65. }
  66. }
  67.  
  68. /* return index of data, return -1 if no data */
  69. @Override
  70. public int search(T data) {
  71. // TODO Auto-generated method stub
  72. int index = -1;
  73. for (int i = 0; i < t.length; i++) {
  74. if (t[i].equals(data)) {
  75. index = i;
  76. break;
  77. }
  78. }
  79. return index;
  80. }
  81.  
  82. @SuppressWarnings("unchecked")
  83. private void resize() {
  84. T[] tmp = (T[]) new Object[t.length * 2];
  85. for (int i = 0; i < t.length; i++) {
  86. tmp[i] = t[i];
  87. t[i] = null;
  88. }
  89. t = tmp;
  90. tmp = null;
  91. }
  92.  
  93. /* from the left to the right is from the top to the bottom of the stack */
  94. @Override
  95. public String toString() {
  96. // TODO Auto-generated method stub
  97. StringBuffer buffer = new StringBuffer();
  98. buffer.append("Linear Stack Content:[");
  99. for (int i = t.length - 1; i > -1; i--) {
  100. buffer.append(t[i].toString() + ",");
  101. }
  102. buffer.append("]");
  103. buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
  104. return buffer.toString();
  105. }
  106.  
  107. }

链式栈:通过单链表进行实现。

  1. package com.peter.java.dsa.common;
  2.  
  3. import com.peter.java.dsa.interfaces.Stack;
  4.  
  5. public class LinkedStack<T> implements Stack<T> {
  6. private Node top;
  7. private int size;
  8.  
  9. @Override
  10. public boolean isEmpty() {
  11. // TODO Auto-generated method stub
  12. return size == 0;
  13. }
  14.  
  15. @Override
  16. public void clear() {
  17. // TODO Auto-generated method stub
  18. top = null;
  19. size = 0;
  20. }
  21.  
  22. @Override
  23. public T pop() {
  24. // TODO Auto-generated method stub
  25. T topValue = null;
  26. if (top != null) {
  27. topValue = top.data;
  28. Node oldTop = top;
  29. top = top.prev;
  30. oldTop.prev = null;
  31. size--;
  32. }
  33. return topValue;
  34. }
  35.  
  36. @Override
  37. public boolean push(T data) {
  38. // TODO Auto-generated method stub
  39. Node oldTop = top;
  40. top = new Node(data);
  41. top.prev = oldTop;
  42. size++;
  43. return true;
  44. }
  45.  
  46. @Override
  47. public int length() {
  48. // TODO Auto-generated method stub
  49. return size;
  50. }
  51.  
  52. @Override
  53. public T peek() {
  54. // TODO Auto-generated method stub
  55. T topValue = null;
  56. if (top != null) {
  57. topValue = top.data;
  58. }
  59. return topValue;
  60. }
  61.  
  62. @Override
  63. public int search(T data) {
  64. // TODO Auto-generated method stub
  65. int index = -1;
  66. Node tmp = top;
  67. for (int i = size - 1; i > -1; i--) {
  68. if (tmp.data.equals(data)) {
  69. index = i;
  70. break;
  71. } else {
  72. tmp = tmp.prev;
  73. }
  74. }
  75. tmp = null;
  76. return index;
  77. }
  78.  
  79. @Override
  80. public String toString() {
  81. // TODO Auto-generated method stub
  82. StringBuffer buffer = new StringBuffer();
  83. buffer.append("Linked Stack Content:[");
  84. Node tmp = top;
  85. for (int i = 0; i < size - 1; i++) {
  86. buffer.append(tmp.toString() + ",");
  87. tmp = tmp.prev;
  88. }
  89. tmp = null;
  90. buffer.append("]");
  91. buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
  92. return super.toString();
  93. }
  94.  
  95. private class Node {
  96. T data;
  97. Node prev;
  98.  
  99. public Node(T data) {
  100. // TODO Auto-generated constructor stub
  101. this.data = data;
  102. }
  103. }
  104.  
  105. }

学习还在进行中,以后会继续更新代码。

数据结构栈的java实现的更多相关文章

  1. 数据结构——栈的实现(数组、Java)

    巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...

  2. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  3. 剑指Offer——栈的java实现和栈的应用举例

    剑指Offer--栈的java实现和栈的应用举例 栈是一种先进后出的数据结构, 栈的实现如下: 首先定义了栈需要实现的接口: public interface MyStack<T> { / ...

  4. 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)

    数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...

  5. 数据结构 -- 栈(Stack)

    一.栈的简介 定义 栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据 ...

  6. 数据结构--队列(Java实现)

    数据结构--队列(Java实现) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 队列是一种特殊的线性表,特殊之处在于它只 ...

  7. “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. 数据结构与算法Java描述 队列

    package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...

  9. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...

随机推荐

  1. CURL重试发送请求

    $url1 = 'http://mk.2000tuan.com/coupon4/apiv2/getMcoupon.php; function curlGet($url) { $handle = cur ...

  2. Android变化如何破解几场金

    我们在玩游戏的总会遇到一些东西需要购买,但是,我们可能要花钱,那么我们应该怎么办呢?这与游戏的插.我们在这里谈论的Android游戏,搜索互联网上的移动端游戏插件,您可能会发现一个叫段:八门神器.ap ...

  3. Jquery基础教程第二版学习记录

    本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...

  4. 使用 CodeIgniter 框架快速开发 PHP 应用(六)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(六) 简化使用 Session 和安全理论说得够多了! 现在让我们开始写我们自己的应用. 在这一章里,我们将会大致描述一下我们要建立的一 ...

  5. 在ASP.net中的UpdatePanel,弹窗失败解决办法

    原文:在ASP.net中的UpdatePanel,弹窗失败解决办法 最开始我用: Response.Write("<script>alert('和哈呵呵呵呵呵呵!')</s ...

  6. uva10827-Maximum sum on a torus(矩阵最大和的变形)

    题目;uva10827-Maximum sum on a torus(矩阵最大和的变形) 题目大意:就是uva108的变形,矩阵能够连通,就是能够从后面连到前面.这里把矩阵复制三遍,然后又一次生成一个 ...

  7. Python学习笔记21:数据库操作(sqlite3)

    Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言. SQLite作为后端数据库,能够搭配Python建站点,或者制作有数据存储需求的工具. SQLite还在其他领域有广泛 ...

  8. Swift中文教程(四)--函数与闭包

    原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: fu ...

  9. jsp的&lt;%%&gt;

    于jsp于 可以使用<% %> 嵌入java代码,简称jsp文字. 可以使用<% -- -- %> 凝视,这是jsp注视 可以使用<%! %> 声明全局变量 版权声 ...

  10. autorun.vbs病毒的清除办法

    症状:计算机里面出现一堆autorun为文件名称的文件,删除后出现找不到autorun.vbs的提示.我就打开当中的一个文件:Autorun.bat,内容例如以下: @echo off  //不显示系 ...