队列和栈(自己动手写API系列一)
前言: 我的建议就是学完什么真正可以让你有收获的东西 写下来
记录下
------------------------------------------------------------------------------------
首先是队列和栈 我这里用的是JAVA语言 因为马上大二了
也不能只用C写一些东西了 摘自<<"Thinking in java">>一书 一
个API 应该首先放的是成员变量 然后是public 的 方法 使用者读
完public就不用在往下读了
------------------------------------------------------------------------------------
一.队列(Queue)
队列是什么? 是一种数据结构 对,但是这种数据结构在日常生活中经常用到
比如你排队的时候 你总要有一个先来后到.
就是你先来了 你买完东西 你就先 离开了
对应到数据 你先进来 你就要 先出去.
接下来让我们看一下队列的方法摘要
public class Queue<Item>//类的声明 Item的泛型
public int size() //返回队列个数大小
public boolean isEmpty() //判断当前是不是空队列 是的话返回true
public void enqueue(Item Date)//向队列添加一个数据
public Item dequeue()//向队列删除一个数据 并返回
public QueueLinkIterator Iterator() //返回自己手写的一个迭代器
private class QueueLinkIterator implements Iterator<Item>
//内部类实现了迭代器
private class Node //内部类 链表的结点
好了 方法基本上看完了这里我们选择链表实现. 在JAVA中写链表要比C语言简单的多
想一想你生活中的排队.
如果又有新人来排队是不是排到了队尾??
队首的人处理完了 队首的人先走?
所以我们必须得要有一个队首 和 队尾对吗?
队首负责出人 队尾负责进人 你发现这样就很简单.
先来看一下我们链表结点的定义
private class Node {
Item Date;
Node next;
Node() {}
Node(Item Date, Node next) {
this.Date = Date;
this.next = next;
}
}
因为这是一个内部类 我们并不想让外界知道所以用private 修饰
那两个构造方法其实也可以不写 我们一会说.
然后就是让我们看一下成员变量
private Node first; //队首的结点
private Node last; //队尾的结点
private int N = 0; // 个数
private int number = 0;//这个是操作数 我们最后讲
先来看 size() 和 isEmpty() 两个超简单的方法
size 代表的是什么? 就是你的个数嘛 不久是你成员的N?
public int size() { return N; }
那isEmpty()判断的是你是不是空队列 是返回true 想想这个条件 也很简单
就是判断队首的位置有没有人就行了
public boolean isEmpty() { return first == null; }
这两个简单的操作基本上搞定了.
然后就是进队和出队了.
我们先来讲进队吧.
public void enqueue(Item Date) //Item 是你要传入的数据类型
让我们看一场图
我们第一个结点是这个样子的
因为只有一个结点 所以 他既是头结点又是尾结点
然后又来了一个结点
因为第一个结点 我们现在first 和last 都是他 但是因为我们进队都是队尾进队
所以让last的下一个等于这个进队的人 然后让last变成新进的人
之后的first都不动了
好了 让我们看看怎么实现
首先让一个临时结点保存last结点
然后让last变成新的结点
让临时结点的下一个指向了last 完成
Node temp = last;
last = new Node(Date, null);