顺序队列/链式队列

        队列是另一种限定性的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素,具有“先进先出”的特点。在队列中,允许插入的一端称为队尾,允许删除的一端称为队首。

        与线性表相似,队列也有两种存储结构:顺序队列和链式队列。

一,顺序队列

        顺序队列使用顺序表来实现的,即队列中的元素均存放在一片连续的内存空间中。通过该片内存的地址对队列中元素进行访问。之前是用数组来实现顺序表的。通过数组名访问数组元素。数组的长度必须提前设定,一旦超过设定的大小,则无法再向其中添加元素。

        这里采用与顺序栈类似的方法,通过设定初始值来动态申请内存,当内存不够用时,修改初始值来再次申请更大的内存达到扩容的目的。所以可以通过动态申请的内存地址来访问队列中的元素。

        因此,以下实现的是可以扩容的顺序队列。

1. 顺序队列的结构

        要实现扩容的顺序队列,

(1)首先要动态申请一片连续的内存。该内存需要一个指针data指向,通过该指针来访问该内存。

(2)而该内存的大小需提前设定,用capacity进行表示

(3)另外,还需要知道队列中实际元素的个数size

        因为队列具有“先进先出”的特点,只能在一端(队尾)进,另一端(队头)出。所以可能造成下面的情况:


        此时,需要时刻知道队列两端所在的位置,但又不能像顺序栈一样用size来表示队尾结点所在位置。所以还需要两个变量:(4)head表示队首结点所在的下标

(5)tail表示队尾结点的下个位置所在的下标(这样入队时直接在tail处设置元素即可)。

        所以,队列中所有元素的下标所在范围为:[head,tail),如下图:


代码如下:

typedef char SeqQueueType;
                                                                                                                                                      
//顺序队列的结构
typedef struct SeqQueue
{
    SeqQueueType* data;//指向顺序队列的指针
    int size;//顺序队列的实际长度
    int capacity;//顺序队列的有效长度
    int head;//顺序队列的头节点所在的下标
    int tail;//顺序队列尾节点下个元素所在的下标,即[head,tail)
}SeqQueue;

2. 顺序队列的初始化

        在对队列初始化时,首先要设定队列有效长度的初始值,再根据该初始值来动态申请内存,并由data指向。因为此时队列中并没有元素,所以,实际长度size,head和tail均置为0即可。

代码如下:

//初始化顺序队列
void SeqQueueInit(SeqQueue* queue)
{
    if(queue == NULL)
    {
        //非法输入
        return;
    }

    queue->size = 0;//初始时队列为空
    queue->capacity =1000;//设置有效长度为1000
    queue->data = (SeqQueueType*)malloc(queue->capacity*sizeof(SeqQueueType));//动态申请内存,由data指向
    queue->head = 0;//初始时,队列为空                                                                                                                
 
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回复您的问题。 为了打印5层杨辉三角,我们可以利用顺序队列或链队列来实现。不过,在建立队列的链表时,需要包含头节点,并使用尾插法来建立队列。 具体来说,我们可以先定义一个节点结构体,包含数据域和指针域,如下所示: ``` typedef struct Node { int data; struct Node *next; } Node; ``` 然后,我们可以定义一个队列结构体,包含头节点和尾节点指针,如下所示: ``` typedef struct Queue { Node *front; Node *rear; } Queue; ``` 接下来,我们可以定义一些队列操作函数,如初始化队列、判断队列是否为空、入队、出队等,具体实现可以参考下面的代码: ``` void initQueue(Queue *q) { q->front = q->rear = (Node *)malloc(sizeof(Node)); q->front->next = NULL; } int isEmpty(Queue *q) { return q->front == q->rear; } void enqueue(Queue *q, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; q->rear->next = newNode; q->rear = newNode; } int dequeue(Queue *q) { if (isEmpty(q)) { printf("Queue is empty.\n"); return -1; } Node *p = q->front->next; int data = p->data; q->front->next = p->next; if (q->rear == p) { q->rear = q->front; } free(p); return data; } ``` 有了队列操作函数,我们就可以利用队列来打印杨辉三角了。具体实现可以参考下面的代码: ``` void printYangHuiTriangle(int n) { Queue q; initQueue(&q); enqueue(&q, 1); for (int i = 1; i <= n; i++) { int pre = ; for (int j = ; j < i; j++) { int cur = dequeue(&q); printf("%d ", cur + pre); pre = cur; enqueue(&q, cur + pre); } printf("\n"); enqueue(&q, 1); } } ``` 在上面的代码中,我们先初始化队列,并将第一行的1入队。然后,我们从第二行开始,每次出队一行的元素,并计算出下一行的元素,将其入队。最后,我们在每行的末尾再入队一个1,以便下一行的计算。 这样,我们就可以利用顺序队列或链队列打印5层杨辉三角了。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值