我正在尝试通过c#进行队列类,为什么出列函数不起作用?

时间:2017-11-20 15:27:22

标签: c# arrays data-structures queue

这是班级 数据成员和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;
}

在主要上它是执行排队好但是将其(第一个++)和(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();
}

2 个答案:

答案 0 :(得分:1)

您希望在first++;counter--;完成后,data[first]将被删除,这是错误的。坦率地说,如果它以某种方式导致data[first]被删除,那么你的其余代码将无效。该代码的作用仅为Dequeue。在Queue的帮助下,使用firstlast标记counter边界,因此只需要更改这些内容并且不需要删除数组元素

让我帮助您理解您的代码。您的Queue课程称为Circular Queue。在这样的实现中,您可以获得为Queue分配的存储量是&#34;已修复&#34;并确定施工。这也意味着当你Enqueue时没有请求额外的内存,当你Dequeue时就没有释放内存。

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

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

答案 1 :(得分:0)

名为data的数组将保持与创建它时相同的状态,因为否则没有做任何事情。