JAVA实现队列的顺序存储结构和操作

这是用JAVA实现队列的顺序存储结构和操作,有兴趣的可以看看。

先定义方法接口:

package com.guobing.queue;

public interface Queue_Interface {

	public void init();            //初始化队列
	public void enter(Object obj); //入队列
	public Object leave();         //出对列
	public Object peek();          //返回队列的首元素
	boolean isEmpty();             //判断队列是否为空
	public void clear();           //清空队列
	public void print();           //打印队列
}

实现:

package com.guobing.queue;
/**
 * 功能:对列的顺序存储结构和操作实现
 * @author guobing
 *
 */
public class Queue implements Queue_Interface{

	/**
	 * 定义对列的必要变量
	 */
	final int minSize = 14;
	private Object [] queueArray; //存储对列的数组引用
	private int front, rear;      //定义对列的尾指针和手指针
	
	/**
	 * 清空队列
	 */
	@Override
	public void clear() {
		front = rear = 0;		
	}

	/**
	 * 向对列中插入元素
	 */
	@Override
	public void enter(Object obj) {
		if(rear + 1 % queueArray.length == front) {  //当对列为满时
			Object[] p = new Object[queueArray.length * 2];
			if(rear == queueArray.length - 1) {      //如果尾指针是数组的最后一位
				for(int i = 1; i <= rear; i++) {     //复制到新的数组
					p[i] = queueArray[i];
				}
			}else {                                  //已经有循环时
				int i, j=1;
				for(i=front + 1; i<queueArray.length; i++,j++)
					p[j] = queueArray[i];            //复制后半部分 
				for(i=0; i<=rear; i++, j++)          //复制前半部分
					p[j] = queueArray[i];
				front = 0;                           //在新数组上给front rear赋值
				rear = queueArray.length - 1;
			}
			/*p[0] = queueArray[front];*/			
			queueArray = p;
		}
		rear = (rear+1) % queueArray.length;         //尾指针加1 为了入对列
		queueArray[rear] = obj;                      //入对列
	}

	/**
	 * 初始化对列
	 */
	@Override
	public void init() {
		front = rear = 0;
		queueArray = new Object[minSize];
	}

	/**
	 * 判断对列是否为空
	 */
	@Override
	public boolean isEmpty() {
		return front == rear;
	}

	/**
	 * 出对列
	 */
	@Override
	public Object leave() {
		if(front == rear)
			return null;
		front = (front + 1) % queueArray.length; //因为对列front为空
		System.out.println("首元素出队列:" + queueArray[front]);
		return queueArray[front];                //所以返回的就是个值	
	}

	/**
	 * 返回对列首元素的值
	 */
	@Override
	public Object peek() {
		if(front == rear)
			return null;
		return queueArray[(front + 1) % queueArray.length];		
	}

	public static void main(String [] args) {
		Queue qu = new Queue();
		qu.init();
		qu.enter("a");
		qu.enter("b");
		qu.enter("c");
		qu.enter("d");
		qu.enter("e");
		qu.enter("f");
		qu.enter("g");
		qu.enter("h");
		qu.enter("i");
		qu.print();
		System.out.println("队列中首元素是:" + qu.peek());
		if(!qu.isEmpty()) {
			qu.leave();
			qu.print();
			System.out.println("队列中首元素是:" + qu.peek());
		}
	}

	/**
	 * 打印对列中的元素
	 * 这只是测试最简单的一种情况,即队列没有满。鉴于时间关系完整的打印就不写了
	 */
	@Override
	public void print() {
		for(int i = front + 1; i <= rear % queueArray.length; i++) {
			System.out.print(queueArray[i] + " ");
		}	
	}
}
测试结果:
a b c d e f g h i 队列中首元素是:a
首元素出队列:a
b c d e f g h i 队列中首元素是:b


终于写完了,有什么疑问可以共同讨论。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值