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. phpmyadmin误删表后的恢复过程(心惊胆跳啊)

    话说今天不知道是抽风了还是失魂了,在用phpmyadmin删除测试数据时,竟然将整个表删除了: 等程序运行出错时,才出现整个表都没有了,而且之前也没有备份好!这下蛋疼了,这个可是production服 ...

  2. POJ——3984

    走迷宫问题,POJ上面的题 #include <stdio.h> #include <stdlib.h> #define SIZE 5 bool findpath = fals ...

  3. Autofac的注入和web.config配合

    public static void BuildMvcContainer() { var builder = new ContainerBuilder(); var assemblys = AppDo ...

  4. chrome下的js调试

    console输出对象信息:console.log(object[,object,.....])

  5. Android操作系统11种传感器介绍

    我们依次看看这十一种传感器 1 加速度传感器 加速度传感器又叫G-sensor,返回x.y.z三轴的加速度数值. 该数值包含地心引力的影响,单位是m/s^2. 将手机平放在桌面上,x轴默认为0,y轴默 ...

  6. supplicant

    概述 wpa_supplicant是wifi客户端(client)加密认证工具,和iwconfig不同,wpa_supplicant支持wep.wpa.wpa2等完整的加密认证,而iwconfig只能 ...

  7. windows下查看所有进程以及pid

    import ctypes import sys __metaclass__ = type class PROCESSENTRY32(ctypes.Structure): _fields_ = [ ( ...

  8. 插入排序 & 快速排序

    2.1 插入排序: 接口定义: int insert_sort(void* data, int size, int esize, int (*compare)(const void* key1, co ...

  9. asp.net解决高并发的方案.

    asp.net解决高并发的方案. Posted on 2012-11-27 22:31 75077027 阅读(3964) 评论(1) 编辑 收藏 最近几天一直在读代震军的博客,他是 Discuz!N ...

  10. java数据结构和算法------希尔排序

    package iYou.neugle.sort; public class Shell_sort { public static void ShellSort(double[] array) { i ...