了解队列(顺序队列)的实现方法

  • 续上节,我们来说说顺序队列的实现,队列对所存储数据的存取方式是FIFO的。
    为了实现队列这种数据结构,以下元素是必不可少的:
    1.一个任意大小的数组;
    2.一个用于存放排在队头的数据对应的索引的变量;
    3.一个用于存放排在队尾的数据对应的索引的变量;
    4.一对儿函数,分别用于把数据存入到队列中和从队列中把数据取出来。

  • 主要需要实现的方法有

public interface IQueue<T> {
	public void clear(); //将队列置空
	public boolean isEmpty(); //判断队列是否为空
	public int length(); //返回队列的数据元素个数
	public T peek() throws Exception; //返回队首元素
	public void offer(T t) throws Exception; //将数据元素x插入到队列成为队尾元素
	public T poll() throws Exception; //将队首元素删除并返回其值
	public void display(); //输出队列中所有元素
}
  • 具体实现
public class MyQueue implements IQueue<Integer> {
	private int[] arrs = new int[100]; //队列本质的数组
	private int front = 0; //队首元素指针
	private int rear = 0; //队尾元素指针
	@Override
	public void clear() {
		// TODO Auto-generated method stub
		/*
		 * 重置数组,队首队尾指针
		 */
		front = 0;
		rear = 0;
		arrs = new int[100];
	}
	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		/*
		 * 队首指针和队列指针的设置是这样的:
		 * 队首指针指向队首元素所在位置;
		 * 队尾指针指向队尾元素的下一个位置;
		 * 也就说如果队中有元素两指针一定不相等,相等即为空;
		 */
		if(front == rear) {
			return true;
		}
		return false;
	}
	@Override
	public int length() {
		// TODO Auto-generated method stub
		int length = rear - front;
		return length;
	}
	@Override
	public Integer peek() throws Exception {
		// TODO Auto-generated method stub
		if(isEmpty()) {
			throw new Exception("队列为空");
		}
		return arrs[front];
	}
	@Override
	public void offer(Integer t) throws Exception {
		// TODO Auto-generated method stub
		if(rear == arrs.length) {
			throw new Exception("队列溢出");
		}
		arrs[rear] = t;
		rear++;
	}
	@Override
	public Integer poll() throws Exception {
		// TODO Auto-generated method stub
		if(isEmpty()) {
			throw new Exception("队列为空");
		}
		Integer poll = arrs[front];
		front++;
		return poll;
	}
	@Override
	public void display() {
		// TODO Auto-generated method stub
		for(int i = rear - 1; i >= front; i--) {
			System.out.print(arrs[i] + " ");
		}
	}
}

  • 测试
public class MyQueueTest {
	public static void main(String[] args) throws Exception {	
		MyQueue myQueue = new MyQueue();
		myQueue.offer(1);
		myQueue.offer(2);
		myQueue.offer(3);
		myQueue.offer(4);
		myQueue.offer(5);
		System.out.println("队列元素个数 " + myQueue.length());
		myQueue.display();
		System.out.println();
		System.out.println("----------");
		System.out.println(myQueue.peek());
		myQueue.poll();
		System.out.println("队列元素个数 " + myQueue.length());
		myQueue.display();
	}
}

测试结果
在这里插入图片描述

  • 缺陷:
    可能出现假溢出现象,即队尾指针等于数组长度,而队首指针可能并不是指向0这个位置,导致一些空间的浪费,怎么解决?
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值