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

首先了解下栈的概念:

栈是限定仅在表头进行插入和删除操作的线性表。有时又叫LIFO(后进先出表)。要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。

"栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。

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

package com.peter.java.dsa.interfaces;

/**

* 栈操作定义

*

* @author Peter Pan

*/

public interface Stack {

/* 判空 */

Boolean isEmpty();

/* 清空栈 */

void clear();

/* 弹栈 */

T pop();

/* 入栈 */

Boolean push(T data);

/* 栈的长度 */

int length();

/* 查看栈顶的元素,但不移除它 */

T peek();

/* 返回对象在栈中的位置 */

int search(T data);

}

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

package com.peter.java.dsa.common;

import com.peter.java.dsa.interfaces.Stack;

/**

* 线性栈

*

* @author Peter Pan

*/

public class LinearStack implements Stack {

@SuppressWarnings("unchecked")

private T[] t = (T[]) new Object[16];

private int size = 0;

@Override

public Boolean isEmpty() {

// TODO Auto-generated method stub

return size == 0;

}

@Override

public void clear() {

// TODO Auto-generated method stub

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

t[i] = null;

}

size = 0;

}

@Override

public T pop() {

// TODO Auto-generated method stub

if (size == 0) {

return null;

}

T tmp = t[size - 1];

t[size - 1] = null;

size--;

return tmp;

}

@Override

public Boolean push(T data) {

// TODO Auto-generated method stub

if (size >= t.length) {

resize();

}

t[size++] = data;

return true;

}

@Override

public int length() {

// TODO Auto-generated method stub

return size;

}

@Override

public T peek() {

// TODO Auto-generated method stub

if (size == 0) {

return null;

} else {

return t[size - 1];

}

}

/* return index of data, return -1 if no data */

@Override

public int search(T data) {

// TODO Auto-generated method stub

int index = -1;

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

if (t[i].equals(data)) {

index = i;

break;

}

}

return index;

}

@SuppressWarnings("unchecked")

private void resize() {

T[] tmp = (T[]) new Object[t.length * 2];

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

tmp[i] = t[i];

t[i] = null;

}

t = tmp;

tmp = null;

}

/* from the left to the right is from the top to the bottom of the stack */

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuffer buffer = new StringBuffer();

buffer.append("Linear Stack Content:[");

for (int i = t.length - 1; i > -1; i--) {

buffer.append(t[i].toString() + ",");

}

buffer.append("]");

buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");

return buffer.toString();

}

}

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

package com.peter.java.dsa.common;

import com.peter.java.dsa.interfaces.Stack;

public class LinkedStack implements Stack {

private Node top;

private int size;

@Override

public Boolean isEmpty() {

// TODO Auto-generated method stub

return size == 0;

}

@Override

public void clear() {

// TODO Auto-generated method stub

top = null;

size = 0;

}

@Override

public T pop() {

// TODO Auto-generated method stub

T topValue = null;

if (top != null) {

topValue = top.data;

Node oldTop = top;

top = top.prev;

oldTop.prev = null;

size--;

}

return topValue;

}

@Override

public Boolean push(T data) {

// TODO Auto-generated method stub

Node oldTop = top;

top = new Node(data);

top.prev = oldTop;

size++;

return true;

}

@Override

public int length() {

// TODO Auto-generated method stub

return size;

}

@Override

public T peek() {

// TODO Auto-generated method stub

T topValue = null;

if (top != null) {

topValue = top.data;

}

return topValue;

}

@Override

public int search(T data) {

// TODO Auto-generated method stub

int index = -1;

Node tmp = top;

for (int i = size - 1; i > -1; i--) {

if (tmp.data.equals(data)) {

index = i;

break;

} else {

tmp = tmp.prev;

}

}

tmp = null;

return index;

}

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuffer buffer = new StringBuffer();

buffer.append("Linked Stack Content:[");

Node tmp = top;

for (int i = 0; i < size - 1; i++) {

buffer.append(tmp.toString() + ",");

tmp = tmp.prev;

}

tmp = null;

buffer.append("]");

buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");

return super.toString();

}

private class Node {

T data;

Node prev;

public Node(T data) {

// TODO Auto-generated constructor stub

this.data = data;

}

}

}

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

就是本文关于Java语言实现数据结构栈代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

java语言链栈_Java语言实现数据结构栈代码详解相关推荐

  1. java一个方法排他调用_Java编程实现排他锁代码详解

    一 .前言 某年某月某天,同事说需要一个文件排他锁功能,需求如下: (1)写操作是排他属性 (2)适用于同一进程的多线程/也适用于多进程的排他操作 (3)容错性:获得锁的进程若Crash,不影响到后续 ...

  2. java中math的方法_Java中Math类常用方法代码详解

    近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void mai ...

  3. java redis 断线重连_redis断线重连代码详解

    redis断线重连代码详解 发布时间:2020-05-08 17:59:39 来源:亿速云 阅读:459 作者:Leah redis断线怎么重连?这个问题可能是我们日常工作经常遇到的.本篇文章主要探讨 ...

  4. java 线程同步的list_java集合框架线程同步代码详解

    List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于Vector ...

  5. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  6. java 接口 返回值_java api返回值的标准化详解

    api返回值的标准化 例如 {"status":200,"message":"操作成功","data":"{\ ...

  7. java tostring格式化日期_java日期格式化SimpleDateFormat的使用详解

    日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引 ...

  8. java打印菱形图案_java打印出菱形图案实例详解

    第一步:首先对图像进行解析 想要打印该图形必须要进行多层循环嵌套,分两个部分进行打印. 第一部分为上半部分前四行,他们是递增的关系,后半部分后三行为递减关系,由此可以得出我们需要写两个打的循环.并且由 ...

  9. java 迭代器的优缺点_java迭代器和for循环优劣详解

    在进行迭代的时候,程序运行的效率也是我们挑选迭代方法的重要原因.目前有三种迭代方法:for循环.迭代器和Foreach.前两者相信大家都非常熟悉,为了更加直观分析效率的不同,我们还加入Foreach一 ...

  10. java random函数用法_JAVA的Random类的用法详解

    Random类主要用来生成随机数,本文详解介绍了Random类的用法,希望能帮到大家. Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时 ...

最新文章

  1. Aop获取bean的过程---spring debug
  2. Hive Sql 时间格式化处理
  3. OpenGL 漫反射辐照度 Diffuse irradiance
  4. 计算机控制用户自己编写什么软件吗,计算机控制软件技术基础.ppt
  5. python __import__和import区别_Python中import 与__import__() 之间的区别比较
  6. 仿码支付全新免签支付系统源码
  7. java获取指定年月往前推12个月的年月_java 获取日期的几天前,几个月前和几年前的实例...
  8. DHCP协议执详解,DHCP协议执行流程、配置方式
  9. python保存数据_python-从数据存储区下载数据
  10. Learning Data Structure_2_线性表、栈和队列
  11. Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
  12. matlab 曲面拟合,matlab曲面拟合
  13. HP计算机管理软件,HP Power Assistant
  14. Android 在mac上显示手机屏幕 MAC 投影 安卓手机
  15. 水星怎么设置网速最快_水星mw300r怎么提高网速
  16. st188脉搏传感器工作原理_各种传感器工作原理动态图,拿走不谢~
  17. 软链接与硬链接的区别
  18. JS里数组合并的几种方法
  19. 《The Art of Assembly Language》中文名:汇编语言编程艺术 中英文正式版本下载
  20. mfc实验报告心得体会_mfc实验报告

热门文章

  1. LeetCode 222. 完全二叉树的节点个数(二分查找)
  2. LeetCode 1029. 两地调度(贪心)
  3. LeetCode 101. 对称二叉树(递归循环)
  4. LeetCode 476. 数字的补数(移位 异或^)
  5. mysql format row_MySQL之InnoDB存储引擎:Row Format行格式
  6. coturn的负载均衡特性_高性能负载均衡
  7. oracle聚合函数wmsys,oracle 自定义聚合函数
  8. 聊聊Spring Cloud版本的那些事儿
  9. YUI经验谈 - 自定义事件默认行为
  10. HDFS NameNode重启优化