[开心IT面试题] 队列的顺序表、链表实现

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;
}

三、链式存储结构







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值