[数据结构与算法]栈Stack的多种实现
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的多种实现的更多相关文章
- javascript数据结构与算法---栈
javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...
- JavaScript数据结构与算法-栈练习
栈的实现 // 栈类 function Stack () { this.dataStore = []; this.top = 0; // 栈顶位置 相当于length,不是索引. this.push ...
- JS数据结构与算法——栈
JS数据结构与算法--栈 1.栈结构概念 栈(Stack)是一种先进后出(LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈. 栈的限制是仅允许在一端进行插入和删除运 ...
- JavaScript数据结构和算法----栈
前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的 ...
- Javascript数据结构与算法--栈的实现与用法
栈数据结构 栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或者待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 我们在生活中常能看到栈的 ...
- 每周一练 之 数据结构与算法(Stack)
最近公司内部在开始做前端技术的技术分享,每周一个主题的 每周一练,以基础知识为主,感觉挺棒的,跟着团队的大佬们学习和复习一些知识,新人也可以多学习一些知识,也把团队内部学习氛围营造起来. 我接下来会开 ...
- C语言- 基础数据结构和算法 - 栈的链式存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 栈的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
随机推荐
- java类的访问权限
1.解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符. private: Java语言中对访问权限限制的最窄的修 ...
- 操作系统,windows编程,网络,socket
首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改. 这十几天学了点关于操作系统.windows编程和网络,主要 ...
- nginx源码安装
1,首先解决系统环境: 安装rpm包组{CentOS6 跟开发相关的包组:} a. Development Tools #yum groupinstall "Development Too ...
- $q服务的API详解
下面我们通过讲解$q的API让你更多的了解promise异步编程模式.$q是做为angularjs的一个服务而存在的,只是对promise异步编程模式的一个简化实现版,源码中剔除注释实现代码也就二百多 ...
- 八大排序算法之六--交换排序—快速排序(Quick Sort)
基本思想: 1)选择一个基准元素,通常选择第一个元素或者最后一个元素, 2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小.另一部分记录的 元素值比基准值大. 3 ...
- Oracle关闭session锁
select session_id from v$locked_object;//找到锁的sessionId SELECT * FROM v$session //查看该sessionId以及对应的 ...
- c#省市联动
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C#事物执行数据
public class sqlservershiwu { public string sqlconString = "Data Source=.;Initial Catalog=TestD ...
- UVa(11292),贪心水题
蓝书P1, 很简单的一个贪心选择,用能力小的去砍小的.本来想双重循环,哎,傻逼了,直接遍历选手,碰到能砍的就砍掉. #include <stdio.h> #include <algo ...
- Poj(1274),二分图匹配
题目链接:http://poj.org/problem?id=1274 The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Tota ...