链表是一个递归的数据结构,它或者为null,或者是指向一个结点的引用,该结点含有一个泛型的元素和指向另一个链表的引用.可以用一个内部类来定义节点的抽象数据类型:

private class Node /*定义节点类*/{
Item item;
Node next;
}

  根据递归的定义,我们只需一个Node类型的变量就能表示一条链表,只要保证它的值是null或者指向另一个Node对象,且该对象的next域指向了另一条链表即可.链表表示的是一列元素,虽然也可以用数组来表示一列元素,但是在链表中插入元素或者从序列中删除元素都十分方便.另外,每个修改链表的操作都需要添加检查是否要修改变量的代码.

  对于链表元素的遍历,可以采用下列方式:

for(Node x=first;x!=null;x=x.next) {
//处理x.item
}

  对于实现队列和堆栈,上面这种迭代方式是实现迭代器的最基本的方式.实现队列和堆栈通过内部维护一个链表,达到了操作所需的时间总是和集合的大小无关.下面是实现的代码:

import java.util.Iterator;
//链表实现的堆栈
public class Stack<Item> implements Iterable<Item>{
private Node first; //定义栈顶
private int N; //定义元素的数量
private class Node {
Item item;
Node next;
} public boolean isEmpty() {
return first==null;
}
public int size() {
return N;
}
public void push(Item item) {
//向栈顶添加元素
Node oldfirst=first;
first=new Node();
first.item=item;
first.next=oldfirst;
N++;
}
public Item pop() {
//从栈顶弹出元素
Item item=first.item;
first=first.next;
N--;
return item;
}
@Override
public Iterator<Item> iterator() {
return new StackIterator();
}
private class StackIterator implements Iterator<Item> { private Node current=first;
@Override
public boolean hasNext() {
return current!=null;
} @Override
public Item next() {
Item item=current.item;
current=current.next;
return item;
}
}
}
//链表实现的队列
import java.util.Iterator;
public class Queue<Item> implements Iterable<Item> {
private Node first; //定义表头
private Node last; //定义表尾
private int N; //定义元素的数量
private class Node /*定义节点类*/{
Item item;
Node next;
}
public boolean isEmpty() {return first==null;}
public int size() {return N;}
public void enquene(Item item) {
//向表尾添加元素
Node oldlast=last;
last=new Node();
last.item=item;
last.next=null;
if(isEmpty()) first=last; //如果添加前,列表为空,此时表头与表尾指向同一元素
else oldlast.next=last; //将之前的尾部元素的下一个元素指向新的尾部元素
N++; //增加元素数目
}
public Item dequeue() {
Item item=first.item;
first=first.next;
if(isEmpty()) last=null; //如果列表成为空,那么将尾部元素设为null
N--; //减少元素数目.
return item;
}
@Override
public Iterator<Item> iterator() {
return new QueueIterator();
}
private class QueueIterator implements Iterator<Item> /*和栈迭代器的实现完全一样*/{ private Node current=first;
@Override
public boolean hasNext() {
return current!=null;
} @Override
public Item next() {
Item item=current.item;
current=current.next;
return item;
}
}
}

算法_栈与队列的Java链表实现的更多相关文章

  1. 数据结构之栈和队列及其Java实现

    栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...

  2. 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解

    前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...

  3. Java数据结构和算法之栈与队列

    二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...

  4. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  5. 栈和队列的java简单实现

    今天看了一本书<啊哈 算法>,书的内容不多,一共两章,第一章是常见的排序算法包括桶排序.冒泡排序和快速排序,这些事基础的排序算法网上有很多资料说明,这里主要说第二章栈,对列,链表,书上使用 ...

  6. ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》

    大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM金牌,保研985,<ACM金牌选手讲解LeetCode算法系列>作者. 上一篇文章讲解了<线性表>中的数组.链 ...

  7. 剑指Offer-5.用两个栈实现队列(C++/Java)

    题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 栈的特点是先进后出,队列的特点则是先进先出. 题目要求我们用两个栈来实现一个队列,栈和队列都有入栈 ...

  8. 两个队列实现栈&两个栈实现队列(JAVA)

    1,两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:栈的特点时先进后出,队列的特点是先进先出. 若此时有两个队列stack1,st ...

  9. 剑指offer第二版面试题8:用两个栈实现队列(JAVA版)

    题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 分析: 我们通过一个具体的例子来分析 ...

随机推荐

  1. $q服务的API详解

    下面我们通过讲解$q的API让你更多的了解promise异步编程模式.$q是做为angularjs的一个服务而存在的,只是对promise异步编程模式的一个简化实现版,源码中剔除注释实现代码也就二百多 ...

  2. 2015-09-17 001 存储过程数据操作类 H_data_Helper

    using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...

  3. 2016年11月1日 星期二 --出埃及记 Exodus 19:17

    2016年11月1日 星期二 --出埃及记 Exodus 19:17 Then Moses led the people out of the camp to meet with God, and t ...

  4. C语言的编译过程

  5. 动态加载JS

    <script> Date.prototype.format = function(format) { var o = { , //month "d+" : this. ...

  6. Windows下通过bat脚本实现自动上传文件到ftp服务器

    @Echo Off Echo open ip_address [port] >ftp.up Echo [username]>>ftp.up Echo [password]>&g ...

  7. css选择器选择顺序是从右往左的,为什么?

    https://segmentfault.com/q/1010000000713509 为什么 CSS 选择器解析的时候是从右往左? CSS 的后代选择器本身就是一种在标准里面不那么推荐的方式. 首先 ...

  8. Quartz:ERROR threw an unhandled Exception

    详细的错误信息如下: -- ::] ERROR org.quartz.core.JobRunShell: - Job group1.job1 threw an unhandled Exception: ...

  9. Common Macros for Build Commands and Properties

    https://msdn.microsoft.com/en-us/library/c02as0cs.aspx $(ProjectDir)      The directory of the proje ...

  10. CANopen笔记1

    CAN现场总线只定义了OSI网络模型的第一层(物理层) 和第二层(数据链路层) ,而这两层一般已被CAN硬件完全实现了.由于没有规定应用层,本身并不完整,需要一个高层协议来定义CAN报文中的11/29 ...