java语言链栈_Java语言实现数据结构栈代码详解
近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。
首先了解下栈的概念:
栈是限定仅在表头进行插入和删除操作的线性表。有时又叫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语言实现数据结构栈代码详解相关推荐
- java一个方法排他调用_Java编程实现排他锁代码详解
一 .前言 某年某月某天,同事说需要一个文件排他锁功能,需求如下: (1)写操作是排他属性 (2)适用于同一进程的多线程/也适用于多进程的排他操作 (3)容错性:获得锁的进程若Crash,不影响到后续 ...
- java中math的方法_Java中Math类常用方法代码详解
近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void mai ...
- java redis 断线重连_redis断线重连代码详解
redis断线重连代码详解 发布时间:2020-05-08 17:59:39 来源:亿速云 阅读:459 作者:Leah redis断线怎么重连?这个问题可能是我们日常工作经常遇到的.本篇文章主要探讨 ...
- java 线程同步的list_java集合框架线程同步代码详解
List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于Vector ...
- java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解
Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...
- java 接口 返回值_java api返回值的标准化详解
api返回值的标准化 例如 {"status":200,"message":"操作成功","data":"{\ ...
- java tostring格式化日期_java日期格式化SimpleDateFormat的使用详解
日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引 ...
- java打印菱形图案_java打印出菱形图案实例详解
第一步:首先对图像进行解析 想要打印该图形必须要进行多层循环嵌套,分两个部分进行打印. 第一部分为上半部分前四行,他们是递增的关系,后半部分后三行为递减关系,由此可以得出我们需要写两个打的循环.并且由 ...
- java 迭代器的优缺点_java迭代器和for循环优劣详解
在进行迭代的时候,程序运行的效率也是我们挑选迭代方法的重要原因.目前有三种迭代方法:for循环.迭代器和Foreach.前两者相信大家都非常熟悉,为了更加直观分析效率的不同,我们还加入Foreach一 ...
- java random函数用法_JAVA的Random类的用法详解
Random类主要用来生成随机数,本文详解介绍了Random类的用法,希望能帮到大家. Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时 ...
最新文章
- Aop获取bean的过程---spring debug
- Hive Sql 时间格式化处理
- OpenGL 漫反射辐照度 	Diffuse irradiance
- 计算机控制用户自己编写什么软件吗,计算机控制软件技术基础.ppt
- python __import__和import区别_Python中import 与__import__() 之间的区别比较
- 仿码支付全新免签支付系统源码
- java获取指定年月往前推12个月的年月_java 获取日期的几天前,几个月前和几年前的实例...
- DHCP协议执详解,DHCP协议执行流程、配置方式
- python保存数据_python-从数据存储区下载数据
- Learning Data Structure_2_线性表、栈和队列
- Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
- matlab 曲面拟合,matlab曲面拟合
- HP计算机管理软件,HP Power Assistant
- Android 在mac上显示手机屏幕 MAC 投影 安卓手机
- 水星怎么设置网速最快_水星mw300r怎么提高网速
- st188脉搏传感器工作原理_各种传感器工作原理动态图,拿走不谢~
- 软链接与硬链接的区别
- JS里数组合并的几种方法
- 《The Art of Assembly Language》中文名:汇编语言编程艺术 中英文正式版本下载
- mfc实验报告心得体会_mfc实验报告
热门文章
- LeetCode 222. 完全二叉树的节点个数(二分查找)
- LeetCode 1029. 两地调度(贪心)
- LeetCode 101. 对称二叉树(递归循环)
- LeetCode 476. 数字的补数(移位 异或^)
- mysql format row_MySQL之InnoDB存储引擎:Row Format行格式
- coturn的负载均衡特性_高性能负载均衡
- oracle聚合函数wmsys,oracle 自定义聚合函数
- 聊聊Spring Cloud版本的那些事儿
- YUI经验谈 - 自定义事件默认行为
- HDFS NameNode重启优化