当前位置: 首页 > 知识库问答 >
问题:

用数组实现队列

汪思博
2023-03-14

我很困惑为什么我的队列不工作,我相信排队和退队方法中存在问题。但是我不确定,我应该实现初始数组大小设置为8的类。一旦元素数量超过该大小,数组大小将加倍。从数组开头移除元素后,需要将数组中的所有元素向左移动一个位置。编写一个测试程序,将从1到20的20个数字添加到队列中,然后删除这些数字并显示它们。这是我的密码

    public class Queue {
    private int[] elements;
    private int size;
    private int first;
    private int last;
    public static final int DEFAULT_CAPACITY = 8;

    public Queue(){
        this (DEFAULT_CAPACITY);
    }
    public Queue (int capacity){
        elements = new int[capacity];
        first = 0;
        last = 0;
        size = 8;
    }
    public void Enqueue(int v){ //fills queue and lengthens if necessary
        if (last>=size){
            int[] temp = new int[elements.length*2];
        System.arraycopy(elements, 0, temp, 0, elements.length);
            elements = temp;
        }
        elements[last]=v;
        last++;

    }
    public int Dequeue(){    
         int output = elements[first];
         System.out.print(output + " ");
        while(last != 0){
            for(int i = 0; i<last;i++){
                elements[i]= elements[i-1];
            }
            last--;
        }
        return output ;
    }
    public boolean empty(){ // tests for empty queue


        return last==first;

    }
    public int getSize(){
        size=last;
        return size;
    }
    }

这里是测试类。

    public class QueueTester {
    public static void main(String[] args){
        Queue q = new Queue();
        q.Enqueue(1);
        q.Enqueue(2);
        q.Enqueue(3);
        q.Enqueue(4);
        q.Enqueue(5);
        q.Enqueue(6);
        q.Enqueue(7);
        q.Enqueue(8);
        q.Enqueue(9);
        q.Enqueue(10);
        q.Enqueue(11);
        q.Enqueue(12);
        q.Enqueue(13);
        q.Enqueue(14);
        q.Enqueue(15);
        q.Enqueue(16);
        q.Enqueue(17);
        q.Enqueue(18);
        q.Enqueue(19);
        q.Enqueue(20);
        while (q.empty()){
            q.Dequeue();

共有2个答案

上官和惬
2023-03-14

嗯,你认为你使用的算法不正确,试试看这个http://projectyogisha.com/implementing-queues/,但它是用C写的。

穆飞龙
2023-03-14
while(last != 0){
    for(int i = 0; i<last;i++){
        elements[i]= elements[i-1];
    }
    last--;
}

删除同时循环。如果您试图确保它没有退出空队列,请进行if条件检查,以确保大小为

 public int Dequeue(){
         if (getSize() == 0) {
             // throw an error or something
         }    
         int output = elements[first];
         System.out.print(output + " ");
         for(int i = 0; i<last;i++){
             elements[i]= elements[i-1];
         }
         last--;
         return output ;
    }

另外,你需要在你的测试类中打印输出,我假设你想在队列不是空的时候退出队列:

 while (!q.empty()){
            System.out.println(q.Dequeue());
 类似资料:
  • 队列简介 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。队列采用的 FIFO

  • 问题内容: 当实现像队列这样的FIFO时,我的教练总是建议我们将其表示为圆形数组,而不是常规数组。为什么? 是因为在后者中,我们最终将在数组中包含垃圾数据吗? 问题答案: 如果您使用固定数量的Array-Slots / Elements,则以循环方式回收插槽比较容易,因为您不需要重新排列Elements的顺序。每当第一个Element以类似Array的方式移除时,您都必须将剩余的Elements向

  • 本文向大家介绍JavaScript数组实现数据结构中的队列与堆栈,包括了JavaScript数组实现数据结构中的队列与堆栈的使用技巧和注意事项,需要的朋友参考一下 一、队列和堆栈的简单介绍 1.1、队列的基本概念   队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出!   如下图所示: 1.2、堆栈的基本概念   堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,

  • 我使用了初始的前置和后置条目为0,因为最初在队列中,任何先进入的条目也将成为最后一个条目。然而,我的老师说我应该保持后面的条目为'-1',当插入一个元素到队列中时,首先增加后面的条目索引,然后添加,反对我的代码先添加后增加。我在网上查了一下,直到现在我也不知道我怎么错了。 如果我错了或者我的老师错了,请给我提供信息?

  • 我正在设计一个购物车, 我的购物车里有X产品。每个产品都与一个商店相关联。 示例产品1由Shop1销售 我以XML的形式获取产品1的详细信息(Shop1中的可用性和价格[当产品售出或价格发生变化时]) 这应该如何处理? 我将项目分为两个部分: 1:项目1 我创建了一个基于表单的应用程序,所有商店都使用它 销售产品时,商店管理员将输入产品详细信息(可用单元数…等)并提交。我将其转换为XML并保存到表

  • 简介 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (largest-in,first-out)的行为特征。 优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有: 查找; 插入一个新元素; 删除。 在最小优先队列(min priority qu