java用数组实现队列
发布网友
发布时间:2022-04-22 21:49
我来回答
共4个回答
热心网友
时间:2022-05-18 19:48
1.1. 队列的数据结构
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受*的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
1.2. Java实现
QueueTest
package ch04;
public class QueueTest {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(10);
System.out.println(queue.isEmpty());
for (int i = 0; i < 10; i++) {
queue.insert(i);
}
System.out.println(queue.isFull());
while (!queue.isEmpty()) {
System.out.println(queue.remove());
}
}
}
class ArrayQueue {
private int[] arrInt;// 内置数组
private int front;// 头指针
private int rear;// 尾指针
public ArrayQueue(int size) {
this.arrInt = new int[size];
front = 0;
rear = -1;
}
/**
* 判断队列是否为空
*
* @return
*/
public boolean isEmpty() {
return front == arrInt.length;
}
/**
* 判断队列是否已满
*
* @return
*/
public boolean isFull() {
return arrInt.length - 1 == rear;
}
/**
* 向队列的队尾插入一个元素
*/
public void insert(int item) {
if (isFull()) {
throw new RuntimeException("队列已满");
}
arrInt[++rear] = item;
}
/**
* 获得对头元素
*
* @return
*/
public int peekFront() {
return arrInt[front];
}
/**
* 获得队尾元素
*
* @return
*/
public int peekRear() {
return arrInt[rear];
}
/**
* 从队列的对头移除一个元素
*
* @return
*/
public int remove() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
}
return arrInt[front++];
}
}
运行结果如下:
false
true
0
1
2
3
4
5
6
7
8
9
热心网友
时间:2022-05-18 21:06
public class Queue {
private int maxSize;
private long[] queueArray;
private int front; // queue header pointer
private int rear; // queue tail pointer
private int elems;
public Queue(int _maxSize) {
this.maxSize = _maxSize;
this.front = 0;
this.rear = -1;
this.elems = 0;
this.queueArray = new long[maxSize];
}
/**
* precondition: the queue is not full
* 一般情况,插入操作是rear(队尾指针)加一后,在队尾指针位置处
* 插入新的数据
* @param value
*/
public void insert(int value) {
if (rear == maxSize - 1) {
rear = -1;
}
queueArray[++rear] = value;
elems++;
}
//precondition: the queue is not empty
public int remove() {
long temp = queueArray[front++];
if (front == maxSize) {
front = 0;
}
elems--;
return (int) temp;
}
public int peek() {
return (int) queueArray[front];
}
public boolean isFull() {
return elems == maxSize;
}
public boolean isEmpty() {
return elems == 0;
}
}
热心网友
时间:2022-05-18 22:40
你在进队列和出队列的时候,用了大量的移动位置操作。这样会大量消耗资源,效率很差。下面我把你的几个函数改了下。
public boolean isEmpty()
{
if(top >-1) return false;
return true;
}
public void push(Object element)
{
top++;
data[top] = element;
}
public Object pop()
{
if(top != -1) return data[top--];
return null;
}
}
热心网友
时间:2022-05-19 02:40
改了2个地方,其他没改,测试通过:
public void push(Object element)
{
this.top++;
for(int i = this.top; i >= 0; i--)//改了i+1 >=0
data[i+1]=data[i];
data[0] = element;
}
public Object pop()
{
Object result = data[top]; //改了data[i],i是局部变量,不能用在这里。
data[top] = null;
this.top--;
return result;
}