这是班级 数据成员和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();
}
答案 0 :(得分:1)
您希望在first++;
和counter--;
完成后,data[first]
将被删除,这是错误的。坦率地说,如果它以某种方式导致data[first]
被删除,那么你的其余代码将无效。该代码的作用仅为Dequeue
。在Queue
的帮助下,使用first
和last
标记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的数组将保持与创建它时相同的状态,因为否则没有做任何事情。