您的位置:首页 > 其它

循环顺序队列2——使用标示位判断队满或空

2015-06-09 01:16 381 查看
public class CircularQueue implements IQueue {
	/**
	 * 循环顺序队列
	 * 采用设置标志位的方法区别循环队列的判空和判满
	 * 包括入队、出队和判队列是否为空
	 * */
	private Object[] queueElem;  //队列存储空间
	private int flag = 0;        //标志变量,当入队操作成功置为0,出队操作成功置为1
	private int front;           //队首
	private int rear;            //队尾
	
	
	public CircularQueue(int maxSize) {
		front = rear = 0;
		queueElem = new Object[maxSize];
	}
	//队列置空
	@Override
	public void clear() {
		front = rear = 0;
		
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return rear == front && flag == 0;
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		return (rear - front + queueElem.length) % queueElem.length;
	}

	//读队首元素
	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		if(isEmpty()){
			return null;
		}
		
		return queueElem[front];
	}

	//入队
	@Override
	public void offer(Object x) throws Exception {
		if(front == rear && flag == 1) {
			throw new Exception("队列已满!");
		}
		else {
			queueElem[rear] = x;
			rear = (rear + 1) % queueElem.length;
			flag = 1;       //入队置flag为1
		}
		
	}
	
	//出队
	@Override
	public Object poll() {
		// TODO Auto-generated method stub
		if(isEmpty()){
			return null;
		}
		else{
			Object q = queueElem[front];
			front = (front + 1) % queueElem.length;
			flag = 0;
			return q;
		}
	}
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: