Posted on 2017-03-28 15:48
为自己代言 阅读(378)
评论(0) 编辑 收藏 所属分类:
算法/数据结构
package stacktest;
/**
* @Author: zzz
* @CreateTime: 2017/3/28 10:52
* @Description: 队列特点(先进先出),链表实现的队列 在队头删除元素,在队尾插入元素。
* 这样才能满足队列的特性。
*/
public class MyQueue<T> {
private Node<T> front; //队列头,只能删除元素
private Node<T> rear; //队列尾,只能用来插入入元素
private int size;//队列的长度
/**
* 初始化队列
*/
public MyQueue() {
front = new Node<T>();
rear = front;
}
/**
* 链表的数据结构
*/
private class Node<T> {
public T data;
public Node<T> next;
public Node(T data, Node next) {
this.data = data;
this.next = next;
}
public Node(T data) {
this.data = data;
}
public Node() {
}
}
public void add(T data) {
//新插入的节点永远是尾节点,它的next 指向null(即没有后继节点)
Node newNode = new Node(data, null);
//让尾节点next指向新节点
rear.next = newNode;
rear = newNode;
size++;
}
public T pop() throws Exception {
if (size < 1) {
throw new Exception("错误,队列为空。");
}
Node<T> nextNode = front.next;
front.next = nextNode.next;
size--;
if (size < 1) {
rear = front;
size = 0;
}
return nextNode.data;
}
//取队首元素
public T peek() throws Exception {
if (size < 1){
throw new Exception("错误,队列为空。");
};
return front.next.data;
}
//返回队列的大小
public int getSize() {
return size;
}
//判断队列是否为空
public boolean isEmpty() {
return size == 0;
}
/**
* 遍历算法,移动front指针,直到front指针追上rear指针
*/
public void traverse(){
for(Node currentNode=front.next; currentNode!=null; currentNode=currentNode.next ){
System.out.println(currentNode.data);
}
}
public static void main(String[] args)throws Exception{
MyQueue<String> queue=new MyQueue<>();
for(int i=0;i<10;i++){
queue.add("88888-"+i);
}
/* for(int i=0;i<10;i++){
String s=queue.pop();
System.out.print(s+";");
}*/
queue.traverse();
}
}