队列——Java实现

package struct;

interface IQueue{
	//入队列
	void add(Object obj);
	//出队列
	Object remove();
	//队列中元素个数(栈大小)
    int size();
    //判断队列是否为空
 	boolean isEmpty();
 	//取队头元素
 	Object getQueueHead();
 	//取队尾元素
 	Object getQueueTail();
 	//清空队列
 	void clear();
}
class Factory3{
	private Factory3(){}
	public static IQueue getIQueueInstance(){
		return new LinkQueueImpl();
	}
}
class LinkQueueImpl implements IQueue{
	Node head;//队列的头
	Node tail;//队列的尾
	int size;
	class Node{
		Node prev;
		Node next;
		Object data;
		public Node(Object data) {
			super();
			this.data = data;
		}
	}
	//入队列(头插)
	public void add(Object obj) {
		Node newNode = new Node(obj);
		//空队列
		if(head == null){
			head = newNode;
			tail = newNode;
			size++;
		}else{
			Node node  = tail;
			newNode.next = node;
			node.prev = newNode;
			tail = newNode;
			size++;
		}
	}
    //出队列(尾删)
	public Object remove() {
		if(isEmpty()){
			return "无要删除元素";
		}else if(head == tail){
			//只有一个元素的队列
			size--;
			return head.data;
		}else{
			Node node = head;
			head = node.prev;
			node.prev = null;
			size--;
			return head.data;
		}
	}
	//求队列长度
	public int size() {
		return size;
	}
	//求队列是否为空
	public boolean isEmpty() {
		return (size()==0);
	}
	//取队首元素
	public Object getQueueHead() {
		return head.data;
	}
	//取对尾元素
	public Object getQueueTail() {
		return tail.data;
	}
	//打印队列
	public void print(){
		myPrint(head);
	}
	//队首到对尾打印元素
	private void myPrint(Node head){
		for(Node node = head;node!=null;node = node.prev){
			System.out.print(node.data+" ");
		}
	}
	//置空队列
	public void clear() {
		if(head == null){
			System.out.println("空队列");
		}else{
			//非空队列
			Node node1 = tail;
			Node node = head;
			for(node = head;head!=tail;){
				head = head.prev;
				node.prev = null;
				node.data = null;
				size--;
			}
			node1.next = null;
			node1.data = null;
			size--;
		}
	}
}
public class LinkQueue {
	public static void main(String[] args) {
		IQueue queue = Factory3.getIQueueInstance();
		//向下转型
		LinkQueueImpl queue1 = (LinkQueueImpl)queue;
		System.out.println("以下为空队列测试情况");
		System.out.println("================remove测试函数==================");
	    System.out.println(queue.remove());
	    System.out.println("================size测试函数==================");
		System.out.println(queue.size());
		System.out.println("================isEmpty测试函数==================");
		System.out.println(queue.isEmpty());
		System.out.println("以下为非空队列测试情况");
		System.out.println("================add和print测试函数==================");
		queue.add("hello");
		queue.add("world!");
		queue.add("hi");
		queue.add("陕科大!");
		queue.add("today");
		queue.add("is");
		queue.add("4月18号!");
		queue1.print();
		System.out.println();
		System.out.println("================getQueueHead测试函数==================");
		System.out.println(queue.getQueueHead());
		System.out.println("================getQueueTail测试函数==================");
		System.out.println(queue.getQueueTail());
		System.out.println("================remove测试函数==================");
		System.out.println(queue.remove());
		System.out.println(queue.remove());
		System.out.println("================remove后print测试函数==================");
		queue1.print();
		System.out.println();
	    System.out.println("================size测试函数==================");
		System.out.println(queue.size());
		System.out.println("================isEmpty测试函数==================");
		System.out.println(queue.isEmpty());
		System.out.println("================clear测试函数==================");
		queue.clear();
		System.out.println(queue.size());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40409115/article/details/79996738