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. 菜鸟的js学习笔记

    学的越多感觉不会的越多.php+mysql学了点皮毛.知道搞web的是要会js的于是开始结合公司的项目开始学习js之旅(http://www.w3school.com.cn/b.asp) $(docu ...

  2. mysql中存不进去json_encode格式的数据

    主要是因为json_encode格式的数据,中间带有\,在存入数据库的时候,会把反斜杠删除了. 所以,想要存进去的话,需要在外层调用一下函数addslashes();这个函数会在每个反斜杠的前面添加反 ...

  3. 【转】Spark 体系结构

    原文地址:http://jerryshao.me/architecture/2013/03/29/spark-overview/ 援引@JerryLead的系统架构图作为Spark整体结构的一个 bi ...

  4. 关于Raw,Assets的使用

    Raw,Assets下文件区别: 相同点:两个目录下的文件在打包后都会原封不动的保存到apk中,不会被编译成二进制. 不同点:Raw下文件不能使用目录结构, 有些格式的会被压缩,能够通过R.raw方便 ...

  5. 【转载】学习C#的28条建议

    1. 看得懂的书,请仔细看:看不懂的书,请硬着头皮看:2. 别指望看第一遍书就能记住和掌握什么——请看第二遍.第三遍:3. 学习编程的秘诀是:编程,编程,再编程:4. 请把书上的程序例子亲手输入到电脑 ...

  6. [笔记]--Python字符串处理

    一.截取字符串中的内容 1.截取: MsiExec.exe /I{AC76BA86-7AD7-2052-7B44-AB0000000001} 中的: {AC76BA86-7AD7-2052-7B44- ...

  7. 【J2EE】Hibernate

    Hibernate是面向Java环境的对象/关系数据库映射工具,管理Java应用和数据库之间的映射关系,提供数据查询和获取数据的方法,可以大幅减少使用JDBC处理数据持久化的时间. 使用Eclipse ...

  8. Android--启动拍照功能并返回结果

    因为没有深入学习拍照这块功能,所以只是简单的调用了一下系统的拍照功能,下面代码: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下s ...

  9. swift学习初步(四)-- 函数

    好了,让我们开始接着前几天写的系列博客开始今天的这篇博客.在swift里面如果你需要定义一个方法的话,你需要使用关键字:func,请看下面的这段代码: func sayHello(name:Strin ...

  10. Oracle12C的EM无法访问怎么办?

    装完Oracle 12c,想体验下EM Express,缺发现不能用,应该怎么办?12c的EM 不再像以前版本配置那么麻烦,当然提供的功能也没有那么多了,只需要启用对应端口即可,请看:To manua ...