package stack;

 /**
* 栈接口
* @author jzj
*
* @param <E>
*/
public interface Stack<E> {
//入栈
public void push(E e); //出栈
public E pop(); //取栈顶元素
public E peek(); //当前栈大小
public int size(); //栈是否为空
public boolean isEmpty();
}
 package stack;

 /**
* 使用 单链表 实现栈
* @author jzj
*
* @param <E>
*/
public class LinkedStack<E> implements Stack<E> {
private class Node {
E data;//数据域
Node next;//next域 Node() {//栈底元素构造函数
data = null;
next = null;
} /**
* 非栈底元素构造函数
* @param data 数据域
* @param next 新建节点next域指向
*/
Node(E data, Node next) {
this.data = data;
this.next = next;
} //是否到栈底元素
boolean isEnd() {
return data == null && next == null;
}
} /*
* 栈顶元素,刚开始时创建一个data与next域都为null的节点,它是一个标志性节点,
* 也相当于栈底,如判断栈是否为空就可以使用它:如果top指向了这个节点,就表明已
* 到栈底了,即栈为空
*/
private Node top = new Node(); //入栈
public void push(E data) {
//让栈顶指向新建节点
top = new Node(data, top);
} //出栈
public E pop() {
//该节点可能是栈底元素,如果是则返回为null
E data = top.data;
if (!top.isEnd()) {//如果不是栈底,则指向下一个元素
top = top.next;
}
return data;
} //取栈顶元素
public E peek() {
//该节点可能是栈底元素,如果是则返回为null
return top.data;
} //栈大小
public int size() {
int size = 0;
Node tmpTop = top;
while (tmpTop.next != null) {
size++;
tmpTop = tmpTop.next;
}
return size;
} //栈是否为空
public boolean isEmpty() {
return top.isEnd();
}
}
 package stack;

 import java.util.LinkedList;

 /**
* 使用 LinkedList 实现栈
* @author jzj
*
* @param <E>
*/
public class LinkedListStack<E> implements Stack<E> {
private LinkedList<E> list = new LinkedList<E>(); //入栈
public void push(E e) {
list.addFirst(e);
} //出栈
public E pop() {
return list.removeFirst();
} //取栈顶元素
public E peek() {
return list.getFirst();
} //当前栈大小
public int size() {
return list.size();
} //栈是否为空
public boolean isEmpty() {
return list.isEmpty();
}
}
 package stack;

 /**
* 使用 数组 实现栈
* @author jzj
*
* @param <E>
*/
public class ArrayStack<E> implements Stack<E> {
private E[] data;
private int top = -1;//指向栈顶元素
private int size = 3; public ArrayStack() {
data = (E[]) new Object[size];
} //入栈
public void push(E e) {
if ((top + 1) == size) {
throw new IllegalStateException("stack full...");
}
data[++top] = e;
} //出栈
public E pop() {
if (top == -1) {
throw new IllegalStateException("stack empty...");
}
E tmp = data[top];
//用完后释放对象,加快垃圾回收,防止大的对象不用发生内存泄露
data[top] = null;
top--;
return tmp;
} //取栈顶元素
public E peek() {
if (top == -1) {
throw new IllegalStateException("stack empty...");
}
return data[top];
} //当前栈大小
public int size() {
return top + 1;
} //栈是否为空
public boolean isEmpty() {
return top == -1;
}
}
 package stack;

 import java.util.ArrayList;

 /**
* 使用 ArrayList 实现栈
* @author jzj
*
* @param <E>
*/
public class ArrayListStack<E> implements Stack<E> {
private ArrayList<E> list = new ArrayList<E>(); //入栈
public void push(E e) {
list.add(e);//ArrayList默认就是在数组尾加入元素,从后面进
} //出栈
public E pop() {
return list.remove(list.size() - 1);//从前面出
} //取栈顶元素
public E peek() {
return list.get(list.size() - 1);
} //当前栈大小
public int size() {
return list.size();
} //栈是否为空
public boolean isEmpty() {
return list.isEmpty();
}
}

[数据结构与算法]栈Stack的多种实现的更多相关文章

  1. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  2. JavaScript数据结构与算法-栈练习

    栈的实现 // 栈类 function Stack () { this.dataStore = []; this.top = 0; // 栈顶位置 相当于length,不是索引. this.push ...

  3. JS数据结构与算法——栈

    JS数据结构与算法--栈 1.栈结构概念 栈(Stack)是一种先进后出(LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈. 栈的限制是仅允许在一端进行插入和删除运 ...

  4. JavaScript数据结构和算法----栈

    前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的 ...

  5. Javascript数据结构与算法--栈的实现与用法

    栈数据结构 栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或者待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 我们在生活中常能看到栈的 ...

  6. 每周一练 之 数据结构与算法(Stack)

    最近公司内部在开始做前端技术的技术分享,每周一个主题的 每周一练,以基础知识为主,感觉挺棒的,跟着团队的大佬们学习和复习一些知识,新人也可以多学习一些知识,也把团队内部学习氛围营造起来. 我接下来会开 ...

  7. C语言- 基础数据结构和算法 - 栈的链式存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  8. C语言- 基础数据结构和算法 - 栈的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  9. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

随机推荐

  1. c# 操作xml题目

    download! 1.新建一个文本文件,命名为:projects.txt. 2.将后缀名改为projects.xml.  3.用记事本编辑该文件.使用utf-8编码.内容如下: <?xml v ...

  2. Bind[Exclude|Include]排除字段或只允许字段验证

    public ActionResult xx([Bind(Exclude = "id")] xxModel xx, HttpPostedFileBase file)//排除id验证 ...

  3. cocos2dx lua bug之module 'lsqlite3' not found

    05-27 15:41:01.360: D/cocos2d-x debug info(7261): [LUA-print] -------------------------------------- ...

  4. matlab mat文件读取和调用

    13.1 数据基本操作 本节介绍基本的数据操作,包括工作区的保存.导入和文件打开.13.1.1 文件的存储 MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时 ...

  5. python-django 模型model字段类型说明

    V=models.CharField(max_length=None<, **options>) #varchar V=models.EmailField(<max_length=7 ...

  6. 20150825 C# 调用带参数的存储过程 模板

    ////// exec proceudre2                        //System.Data.SqlClient.SqlConnection sqlcon = new Sys ...

  7. asp.net 父窗体获取子窗体的返回值,可用来对父窗体局部更新

    今天在项目上遇到了这个问题,其实只是window.returnValue的简单应用,不是asp.net的专属内容.作为积累,记录一个简单的实现模型. 图1  用到的文件 从图1中我们可以看到,只用到了 ...

  8. php编译器

    WordPress http://pan.baidu.com/s/1eQnOnv0 epp3: http://pan.baidu.com/s/1pJKFOD1 配合xampp: http://pan. ...

  9. 从hadoop框架与MapReduce模式中谈海量数据处理

    http://blog.csdn.net/wind19/article/details/7716326 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显 ...

  10. JAVA基础知识之多线程——线程通信

    传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...