C++面试题中很大一个板块——数据结构,主要包括线性表、栈、队列、字符串、二叉树等等,今天我们说说队列。
一、概念
队列是限定性线性表,只允许在表的一端插入元素,而在另一端删除元素的线性表。允许删除一端称为队头,允许插入一端称为队尾;队列的特性是先进先出。队列的存储方式有两种:顺序存储结构和链式存储结构。
二、顺序存储结构
用一组连续的存储单元依次存放自队头到队尾的数据元素,设一个位置指针front(队头指针)动态指示队头元素在顺序队列中的位置,设一个位置指针rear(队尾指针)动态指示队尾元素在顺序队列中的位置。数据元素可以是任意类型的数据,但所有的数据元素必须是同一种类型。front=rear表示空队列。
1、存储结构
typedef int SElemType; //变量类型
#define QUEUE_SIZE 100 //队列的初始大小
typedef struct SeqQueue
{
SElemType data[QUEUE_SIZE];
int front;
int rear;
}SeqQueue, *pSeqQueue;
2、初始化队列
void Init_SeqQueue(SeqQueue *queue)
{
//queue中变量全置为0
memset(queue, 0, sizeof(SeqQueue));
}
3、打印队列
void Printf_SeqQueue(SeqQueue *queue)
{
for(int i = queue->front; i < queue->rear; i++)
{
printf("%d ", queue->data[i]);
}
printf("\n");
}
4、队列求长
int Length_SeqQueue(SeqQueue *queue)
{
return (queue->rear-queue->front);
}
5、判断队列是否为空
bool IsEmpty_SeqQueue(SeqQueue *queue)
{
return (queue->front == queue->rear);
}
6、判断队列是否已满
bool IsFull_SeqQueue(SeqQueue *queue)
{
//由于入队和出队操作中,头尾只增加不减小,导致队头被删除的空间无法重新使用。
//当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。
//该现象称为"假上溢"现象。
//当元素被插入到数组中下标最大的位置之后,队列的空间就用尽了,尽管此时数组的前面还有空间空间也算队列已满。
return (queue->rear+1 == QUEUE_SIZE);
}
7、入队运算
bool Push_SeqQueue(SeqQueue *queue, SElemType value)
{
if(IsFull_SeqQueue(queue))
{
return false;
}
queue->data[queue->rear] = value;
queue->rear++;
return true;
}
8、出队运算
bool Pop_SeqQueue(SeqQueue *queue, SElemType *value)
{
if(IsEmpty_SeqQueue(queue))
{
return false;
}
*value = queue->data[queue->front];
queue->front++;
return true;
}
三、链式存储结构