#Z1012. [伴随编程] 手动实现一个队列
[伴随编程] 手动实现一个队列
我们动手来实现队列这个数据结构。为了便于代码复用和调试,我们通常会把数据结构封装起来——将队列写成一个struct,将当前队列的数据和操作都放在里面。
我们首先定义一个结构体Queue,然后定义用来储存数据的数组int data[10000],这里开辟了固定容量的空间,在使用中超过限制就会发生溢出。因为我们把数组定义成了int,那么这个队列自然只能储存整数了。
然后,用两个变量front和rear分别表示队首和队尾的位置,即data下标在 [front,rear] 范围内的元素是在队列中的。初始的时候,队列为空,想一想这里front和rear 初始值的含义是什么?
-
我们来实现push操作,把元素插入队尾。队尾的位置需要往后移动一位,也就是先自增rear,再给赋予data[rear]新的值。注意我们开的空间只有 10000,当rear大于等于 10000 时会发生溢出。
在Queue结构体将 push 函数补全为:
void push(int x) {
rear++;
if (rear < 10000) {
data[rear] = x;
}
}
- 接下来,我们来实现pop操作,即把队列头部的元素弹出。当
front <= rear
时,说明队列不为空,把front自增 1 就相当于队首元素出队。当队列为空时,不进行任何操作。请你将 pop 函数补全吧~ - 这一步,我们实现获取队首元素的操作。同样需要判断队列是否为空,如果不为空,data[front]就是队首元素,否则该操作已是非法操作,返回 -1。
注意:该操作只是单纯的获取值,并不会让队首元素出队。
请你根据上面的描述,自己实现一下 front_val 函数吧!
- 实现获取队列元素个数的函数,显然元素个数为rear - front + 1。
在Queue结构体中 size 函数体内部写:
return rear - front + 1;
- 已写代码已经将 1 到 10依次入队了,并且输出此时队列中元素的个数,运行一下,看一看是不是输出了 10。
- 接下来我们来做出队操作,用一个 while 循环输出队首的元素,然后一个个弹出队列,直到队列为空。
在 return 0; 上一行写:
while(q.size() > 0) {
cout << q.front_val() << " ";
q.pop();
}
- 点击 运行,看看出队的序列是不是符合队列的性质。