先写一个接口,确定要实现的功能
有两个问题
package myQueue;
public interface MyQueue<Object> {
//删除队列
void clear();
//队尾插入元素
boolean enqueue(Object data);
//对首删除元素
Object dequeue();
//队列中元素的个数
int length();
//判断队列是否为空
boolean isEmpty();
//判断队里是否满了(用于顺序队列,在链式队列中可以空实现)
boolean isFull();
}
顺序队列
package myQueue;
public class QueueArray implements MyQueue<Object>{
private int size;
private int MAX_SIZE;
private int front;
private int rear;
private Object[] queueArray;
public QueueArray(int MAX_SIZE)
{
size = front = rear = 0;
this.MAX_SIZE = MAX_SIZE;
queueArray = new Object[MAX_SIZE];
}
@Override
public void clear() {
front = rear;
}
@Override
public boolean enqueue(Object data) {
if(size == MAX_SIZE)
return false;
rear = (rear + 1) % MAX_SIZE;
queueArray[rear] = data;
size++;
return true;
}
@Override
public Object dequeue() {
if(size == 0)
return null;
Object obj = queueArray[front];
front = (front + 1) % MAX_SIZE;
size--;
return obj;
}
@Override
public int length() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean isFull() {
return size == MAX_SIZE;
}
public void print()
{
int pre = this.front;
while(pre != rear)
{
System.out.print(queueArray[pre] + " ");
pre = (pre + 1) % MAX_SIZE;
}
System.out.println();
}
public static void main(String[] args)
{
QueueArray qa = new QueueArray(20);
for(int i = 0;i < 10;i++)
{
qa.enqueue(i);
}
qa.print();
qa.dequeue();
qa.print();
}
}
链式队列
package myQueue;
public class QueueLL implements MyQueue{
private class LinkNode
{
Object element;
LinkNode next;
LinkNode(Object element,LinkNode next)
{
this.element = element;
this.next = next;
}
LinkNode(LinkNode next)
{
this.next = next;
}
}
LinkNode front;
LinkNode rear;
int size;
QueueLL()
{
front = rear = null;
size = 0;
}
@Override
public void clear() {
while(front != null)
{
rear = front;
front = front.next;
rear = null;
}
rear = null;
size = 0;
}
@Override
public boolean enqueue(Object data) {
if(rear == null)
{
front = rear = new LinkNode(data,null);
}
else
{
rear.next = new LinkNode(data,null);
rear = rear.next;
}
size++;
return true;
}
@Override
public Object dequeue() {
if(size == 0)
return null;
LinkNode ltemp = front;
front = front.next;
Object obj = ltemp.element;
if(front == null)
rear = null;
size--;
return obj;
}
@Override
public int length() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean isFull() {
return false;
}
public void print()
{
LinkNode ltemp = front;
while(ltemp != null)
{
System.out.print(ltemp.element + " ");
ltemp = ltemp.next;
}
System.out.println();
}
public static void main(String[] args)
{
QueueLL qll = new QueueLL();
for(int i = 0;i < 10;i++)
{
qll.enqueue(i);
}
qll.print();
qll.dequeue();
qll.print();
qll.enqueue(10);
qll.print();
}
}
有两个问题
1、再插入和删除的时候有些判断还不是太懂,要花点时间在上面
2、怎么消除头结点值为空,我想到了两种方法
a、在插入的时候判断
b、插入后删除头结点
第一种很定会怎加时间开销,而第二种有不符合面向对象的机制