【问题标题】:i'm trying to make queue class by c # the why dequeueing function doesn't work?我正在尝试通过c#创建队列类为什么出队功能不起作用?
【发布时间】:2017-11-20 15:27:22
【问题描述】:

这是班级 数据成员、getter 和 setter:

class Queue
{
    int[] data; //array
    int size; //size of array
    int counter; //checker if array is fully or impty
    int first; // first element of array
    int last; // last element of arry
}

固定大小的构造函数

public Queue(int size) { 
    data = new int[this.size];
    size = this.size;
    counter = 0;
    first = 0;
    last = 0;
}

默认构造函数

public Queue() { //default constructor
    data = new int[10];
    size = 10;
    counter = 0;
    first = 0;
    last = 0;
}

入队函数“推”

public bool Enqueue(int num) { 
    bool result;
    if (counter<size)
    {
        data[last] = num;   
        last++;
        if(last == size)
            last = 0;
        counter++;
        return result = true
    }
    else
    {
        return result = false;
    }
    return result;
}

出队函数“pop”

public int Dequeueing() {
    int result=-1;
    // I know that i should make this nullable function but (-1) good at this time

    if (counter>0)
    {
        result = data[first];
        first++;
        if (first==size)
            first = 0;
        counter--;
    }
    return result;
}

主要是执行入队良好但将其(first++)和(counter--)出队但它不会删除第一个输入** **为什么不删除 (17)

static void Main(string[] args)
{
    Queue q1 = new Queue();
    q1.Enqueue(17);
    q1.Enqueue(20);
    q1.Enqueue(25);
    q1.Enqueue(15);
    q1.Enqueue(14);
    q1.Enqueue(13);
    q1.Dequeueing();        

    Console.ReadLine();
}

【问题讨论】:

  • 你只是在练习吗?因为有一个内置的queue

标签: c# arrays data-structures queue


【解决方案1】:

您期望一旦您执行first++;counter--;data[first] 将被删除是错误的。坦率地说,如果它会以某种方式导致 data[first] 被删除,那么您的其余代码将无法正常工作。该代码所做的只是简单地Dequeue。在counter 的帮助下,Queue 边界使用firstlast 标记,因此只需更改这些内容,无需删除数组元素

让我帮助您稍微理解一下您的代码。你的Queue 类就是所谓的Circular Queue。在这样的实现中,您的好处是为Queue 分配的存储量是“固定的”并在构造时确定。这也意味着当您Enqueue 时不会请求额外的内存,而当您Dequeue 时不会释放内存。

如果您希望以某种方式识别数组中的未占用槽,您可以使用特殊值。比如制作int?[] data,可以在Dequeueing之前存储var item = data[front]; data[front] = null。或者,您可以使用GetQueueData 之类的例程将Queue 中的所有元素作为单独的IEnumerable 返回

public IEnumerable<int> GetQueueData() {
    for (int i = first, cnt = 0; cnt < counter; i = (i + 1) % size, ++cnt)
        yield return data[i];
}

【讨论】:

    【解决方案2】:

    名为 data 的数组将保持与您创建它时相同的状态,因为您没有做任何其他操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      相关资源
      最近更新 更多