1 package struct;
2
3 interface IQueue{
4 //入队列
5 void add(Object obj);
6 //出队列
7 Object remove();
8 //队列中元素个数(栈大小)
9 int size();
10 //判断队列是否为空
11 boolean isEmpty();
12 //取队头元素
13 Object getQueueHead();
14 //取队尾元素
15 Object getQueueTail();
16 //清空队列
17 void clear();
18 }
19 class Factory3{
20 private Factory3(){}
21 public static IQueue getIQueueInstance(){
22 return new LinkQueueImpl();
23 }
24 }
25 class LinkQueueImpl implements IQueue{
26 Node head;//队列的头
27 Node tail;//队列的尾
28 int size;
29 class Node{
30 Node prev;
31 Node next;
32 Object data;
33 public Node(Object data) {
34 super();
35 this.data = data;
36 }
37 }
38 //入队列(头插)
39 public void add(Object obj) {
40 Node newNode = new Node(obj);
41 //空队列
42 if(head == null){
43 head = newNode;
44 tail = newNode;
45 size++;
46 }else{
47 Node node = tail;
48 newNode.next = node;
49 node.prev = newNode;
50 tail = newNode;
51 size++;
52 }
53 }
54 //出队列(尾删)
55 public Object remove() {
56 if(isEmpty()){
57 return "无要删除元素";
58 }else if(head == tail){
59 //只有一个元素的队列
60 size--;
61 return head.data;
62 }else{
63 Node node = head;
64 head = node.prev;
65 node.prev = null;
66 size--;
67 return head.data;
68 }
69 }
70 //求队列长度
71 public int size() {
72 return size;
73 }
74 //求队列是否为空
75 public boolean isEmpty() {
76 return (size()==0);
77 }
78 //取队首元素
79 public Object getQueueHead() {
80 return head.data;
81 }
82 //取对尾元素
83 public Object getQueueTail() {
84 return tail.data;
85 }
86 //打印队列
87 public void print(){
88 myPrint(head);
89 }
90 //队首到对尾打印元素
91 private void myPrint(Node head){
92 for(Node node = head;node!=null;node = node.prev){
93 System.out.print(node.data+" ");
94 }
95 }
96 //置空队列
97 public void clear() {
98 if(head == null){
99 System.out.println("空队列");
100 }else{
101 //非空队列
102 Node node1 = tail;
103 Node node = head;
104 for(node = head;head!=tail;){
105 head = head.prev;
106 node.prev = null;
107 node.data = null;
108 size--;
109 }
110 node1.next = null;
111 node1.data = null;
112 size--;
113 }
114 }
115 }
116 public class LinkQueue {
117 public static void main(String[] args) {
118 IQueue queue = Factory3.getIQueueInstance();
119 //向下转型
120 LinkQueueImpl queue1 = (LinkQueueImpl)queue;
121 System.out.println("以下为空队列测试情况");
122 System.out.println("================remove测试函数==================");
123 System.out.println(queue.remove());
124 System.out.println("================size测试函数==================");
125 System.out.println(queue.size());
126 System.out.println("================isEmpty测试函数==================");
127 System.out.println(queue.isEmpty());
128 System.out.println("以下为非空队列测试情况");
129 System.out.println("================add和print测试函数==================");
130 queue.add("hello");
131 queue.add("world!");
132 queue.add("hi");
133 queue.add("陕科大!");
134 queue.add("today");
135 queue.add("is");
136 queue.add("4月18号!");
137 queue1.print();
138 System.out.println();
139 System.out.println("================getQueueHead测试函数==================");
140 System.out.println(queue.getQueueHead());
141 System.out.println("================getQueueTail测试函数==================");
142 System.out.println(queue.getQueueTail());
143 System.out.println("================remove测试函数==================");
144 System.out.println(queue.remove());
145 System.out.println(queue.remove());
146 System.out.println("================remove后print测试函数==================");
147 queue1.print();
148 System.out.println();
149 System.out.println("================size测试函数==================");
150 System.out.println(queue.size());
151 System.out.println("================isEmpty测试函数==================");
152 System.out.println(queue.isEmpty());
153 System.out.println("================clear测试函数==================");
154 queue.clear();
155 System.out.println(queue.size());
156 }
157 }