问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
绿茶要猛冲吗,绿茶鲜嫩不需要(绿茶冲泡的正确方式) 绿茶为什么越好越不耐泡 绿茶要泡几泡?哪种绿茶最耐泡? 哪种绿茶最耐泡 职场故事:美女职员遇到暴躁老板 老板脾气坏得要命,我该怎么办 老板老爱发脾气,我们应该怎么做呀? 害怕老总发脾气怎么办 网络上用名字测和另一个人的关系准确吗 一个男生把自己的名字和另一个人的名字放在一起,中间放个"&amp;"符号... 安卓系统可以把gif图片保存到手机相册 而且还是动态的吗? Java如何在内存有限的情况下实现一个超大数组 GIF图怎么存到苹果相册里 并且它能动! java数组问题 微信好友删除了再加回来聊天记录还能找回吗? 已经删除的微信好友还能查出以前的聊天记录吗? 已删除的微信好友,再加上,以前的聊天记录还能找回吗? 如果删除了微信朋友重新再添加,以前的聊天记录可以找回来吗? 青菜,水果总共有多少种? 过年放假有工资吗? 老板已是个体户不是企业为由不给开春节假期的工资合法吗? 春节放假是不是带薪的 夏天有哪些时令蔬菜和水果? 春节放假期间有工资吗? 微信好友和聊天记录都删除了,能否再找回以前的聊天记录? 中性的蔬菜和水果有哪些? 春节放假都是带薪休假么 含有维生素的水果和蔬菜有哪些 国家规定的春节7天假期,假期有工资吗,按国家规定是怎么算的? 绿色的水果蔬菜有哪些 微信相册里GIF照片怎么删除- 问一问 Java 一个方法返回多个数组可以吗?怎么实现? 把动gif保存到手机相册里,但是是静态的,怎么弄? java二维double数组去重问题? 为什么苹果手机保存GIF图在相册里却是静态的? Java的二维数组问题 要用cmd运行出来啊 iPhone6的相册如何保存gif图片? 三星手机相册 gif点开才动,不点开就不动,怎么设置小图浏览时,全部gif都在动? 苹果手机相册怎么不能显示gif动态图? 怎么保存柠檬 柠檬的储存方法 从老家带回很多柠檬,该如何放存才不坏掉了? 柠檬买回来怎么储存呢?要放在冰箱里吗? 柠檬怎么储存? 柠檬怎样储存 午餐肉罐头怎么吃,需要加热吗? 午餐肉罐头和什么菜一起炒好吃 午餐肉罐头都可以怎么吃? 罐装午餐肉怎样才能完整的从罐里取出来? 正确打开午餐肉罐头的省力方法?