java数据结构系列之栈

手写栈

1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为它要维护自己的指针(Next)引用。


package com.rsc.stack; import java.util.LinkedList; /**
* 利用链表实现的栈
* @author 落雨
* http://ae6623.cn
* @param <T>
*/
public class LinkedListStack<T> {
LinkedList<T> list; public LinkedListStack() {
list = new LinkedList();
} /**
* 出栈
*
* @return
*/
public T pop() {
return list.removeLast();
} /**
* 入栈
*
* @param t
*/
public void push(T t) {
list.add(t);
} public T getTop() {
return list.getLast();
} public boolean isEmpty() {
return list.size() == 0;
} public int getSize() {
return list.size();
} public static void main(String[] args) {
LinkedListStack<String> ls = new LinkedListStack<String>();
System.out.println(ls.getSize());
ls.push("2");
ls.push("我");
ls.push("你");
ls.push("他");
ls.push("1");
ls.push("3");
ls.push("5");
System.out.println(ls.getSize());
System.out.println(ls.getTop()); ls.pop();
System.out.println(ls.getSize());
System.out.println(ls.getTop()); ls.push("嘿嘿");
System.out.println(ls.getSize());
System.out.println(ls.getTop()); } }

打印结果: 0
7
5
6
3
7
嘿嘿

2.利用数组实现的栈,好处是速度快,坏处是要考虑数组的扩容,既然要扩容,肯定就涉及数组元素的拷贝,一对一的一个萝卜一个坑的塞过去,相对链表来说,它的插入和删除就比链表要快,因为它不用维护指针(Next),不懂这个指针next的同学,自行脑补链表的实现方式,下节会说到链表的实现。

package com.rsc.stack;

import java.util.Arrays;

/**
* 利用数组实现的栈的数据结构
*
* @author
* 落雨 2015年6月5日 http://ae6623.cn
*
*/
public class ArrayStack { public Object[] t;// 存数的数据数组
int top = 0;// 默认Top为0 public ArrayStack(int size) {
t = new Object[size];
} public boolean isEmpty() {
return top == 0;
} public boolean clean() {
top = 0;
return true;
} public void pop() {
if (top > 0) {
t[--top] = null;
}
System.out.println(getTop());
} public void push(Object o) { // 检测扩容
if (top >= t.length) {
int newCapacity = (t.length * 3) / 2 + 1; // 增加50%+1
Object[] newObject = new Object[newCapacity];
int k = 0;
for (Object i : t) {
newObject[k++] = i;
}
t = newObject;
} t[top++] = o;
System.out.println(getTop());
} public Object getTop() {
System.out.println("top:" + top);
printStack();
return top <= 0 ? null : "当前栈顶元素:" + t[top - 1];
} public int getSize() {
return top;
} public void printStack() {
System.out.println(Arrays.toString(t));
} public static void main(String[] args) {
ArrayStack as = new ArrayStack(5); as.push("1");
as.push("2");
as.push("3");
as.push("4");
as.push("5");
as.push("我");
as.push("6");
as.push("7");
as.printStack();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop(); }
}

打印结果: top:1
[1, null, null, null, null]
当前栈顶元素:1
top:2
[1, 2, null, null, null]
当前栈顶元素:2
top:3
[1, 2, 3, null, null]
当前栈顶元素:3
top:4
[1, 2, 3, 4, null]
当前栈顶元素:4
top:5
[1, 2, 3, 4, 5]
当前栈顶元素:5
top:6
[1, 2, 3, 4, 5, 我, null, null]
当前栈顶元素:我
top:7
[1, 2, 3, 4, 5, 我, 6, null]
当前栈顶元素:6
top:8
[1, 2, 3, 4, 5, 我, 6, 7]
当前栈顶元素:7
[1, 2, 3, 4, 5, 我, 6, 7]
top:7
[1, 2, 3, 4, 5, 我, 6, null]
当前栈顶元素:6
top:6
[1, 2, 3, 4, 5, 我, null, null]
当前栈顶元素:我
top:5
[1, 2, 3, 4, 5, null, null, null]
当前栈顶元素:5
top:4
[1, 2, 3, 4, null, null, null, null]
当前栈顶元素:4
top:3
[1, 2, 3, null, null, null, null, null]
当前栈顶元素:3
top:2
[1, 2, null, null, null, null, null, null]
当前栈顶元素:2
top:1
[1, null, null, null, null, null, null, null]
当前栈顶元素:1
top:0
[null, null, null, null, null, null, null, null]
null
top:0
[null, null, null, null, null, null, null, null]
null

JAVA数据结构系列 栈的更多相关文章

  1. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  2. Java数据结构之栈(Stack)

    1.栈(Stack)的介绍 栈是一个先入后出(FILO:First In Last Out)的有序列表. 栈(Stack)是限制线性表中元素的插入和删除只能在同一端进行的一种特殊线性表. 允许插入和删 ...

  3. java数据结构-07栈

    一.什么是栈 栈是一种线性结构,栈的特点就是先进后出(FILO):就像弹夹装子弹一样,最先压进去的在最底下,最后才被射出.  二.相关接口设计  三.栈的实现 栈可以用之前的数组.链表等设计,这里我使 ...

  4. java数据结构系列——排列(2):有序阵列

    package Array; /** * 对数组排序.当添加到阵列保持有序数组元素: * @author wl * */ public class MyOrderArray { private lon ...

  5. java数据结构系列之——数组(1)

    import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private ...

  6. Java数据结构系列——简单排序:泡、选择、直接进入

    package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中.小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序 ...

  7. Java数据结构系列(1)——自平衡二叉树

    1.基本概念 所谓自平衡二叉树,就是当我们插入或删除元素之后,二叉树的高度会自动调整到最小,这样我们就可以在对数时间内查找二叉树内的元素. 2.定义 TreeSet<Elemtype> s ...

  8. java 数据结构 栈的实现

    java数据结构之栈的实现,可是入栈,出栈操作: /** * java数据结构之栈的实现 * 2016/4/26 **/ package cn.Link; public class Stack{ No ...

  9. 自己动手实现java数据结构(一) 向量

    1.向量介绍 计算机程序主要运行在内存中,而内存在逻辑上可以被看做是连续的地址.为了充分利用这一特性,在主流的编程语言中都存在一种底层的被称为数组(Array)的数据结构与之对应.在使用数组时需要事先 ...

随机推荐

  1. MapReduce数据流

    图4.5细节化的Hadoop MapReduce数据流 图4.5展示了流线水中的更多机制.虽然只有2个节点,但相同的流水线可以复制到跨越大量节点的系统上.下去的几个段落会详细讲述MapReduce程序 ...

  2. S5PV2210

    http://www.doc88.com/p-773451739254.html CAN转换器 CAN总线信息转换输出装置 基于车载CAN总线的倒车雷达单元设计[图] http://www.doc88 ...

  3. Android SDK中国在线更新镜像服务器 解决GOOGLE更新无法下载 更新失败的问题

    Android Tools Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.opencas.cn 端口:80 IPV4/I ...

  4. xml结构

    一.XmlHelper using System; using System.Collections.Generic; using System.Linq; using System.Web; usi ...

  5. STM32F0xx_SPI读写(Flash)配置详细过程

    Ⅰ.概述 关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握的一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题.在 ...

  6. Mybatis 中常用的java类型与jdbc类型

    JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...

  7. java 单例模式总结

    单例模式的实现方式总结: 第一种方式:同步获取实例的方法,多线程安全,懒汉模式.在调用实例的时刻初始化. public class Singleton1 { private static Single ...

  8. C语言中断言ASSERT

    我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种&qu ...

  9. AppCan应用开发之插件实践篇-支付插件

    电商O2O无疑是目前最受用户欢迎的APP类型,而在这类APP中必不可少的就是在线支付功能了.在AppCan平台开发这类应用时,官方封装了微信支付.支付宝.银联等多种支付SDK,更接入了多家聚合支付平台 ...

  10. hdu 1427 速算24点

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...