单链表循环队列

本文详细介绍了如何使用C++实现一个单链表循环队列,包括创建队列、判断队列是否为空、入队、出队等操作。在isEmpty函数中,当size_为0时,输出'The queue is empty'并返回true。enQueue函数实现了将元素插入队列尾部,而deQueue函数则移除队首元素并返回其值。此外,还提供了一个printQueue函数用于打印整个队列的元素。
摘要由CSDN通过智能技术生成
//
//  queue_.cpp
//  Cycle
//
//  Created by ljpc on 2018/5/30.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include "queue_.h"

void creatCycleQueue(CycleQueue* que)
//  创建一个循环队列指针que
{
    que->size_ = 0;
    que->rear = NULL;
}

bool isEmpty(CycleQueue* que)
//  判断队列que是否为空
//  若空返回 true 并在一行打印 The queue is Empty 末尾换行!!!
//  否则返回 false
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    if( que->size_ == 0)
    {
        printf("The queue is Empty\n");
        return true;
    }
    else
    {
        return false;
    }
    /********** End **********/
}

void enQueue(CycleQueue* que, int item)
//  实现入队操作:将元素item加入队列que尾部
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    struct Node *a;
    a = (Node*)malloc(sizeof(Node));
    a->data = item;
    if (que->size_ == 0)
    {
        que->rear = a;
        que->rear->next = a;
    }
    else
    {
        a->next=que->rear->next;
        que->rear->next=a;
        que->rear=a;
    }
    que->size_++;
    /********** End **********/
}

int deQueue(CycleQueue* que)
//  实现出队操作:移除队列que首部元素,并返回元素值
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int a=que->rear->next->data;
    if(que->size_==1)
    {
        que->rear->next=NULL;
        que->rear=NULL;
    }
    else
    {
        que->rear->next=que->rear->next->next;
        que->size_--;
    }
    return a;
    /********** End **********/
}

void printQueue(CycleQueue* que)
//  打印队列
{
    while (isEmpty(que)==false) 
    {
        int item = deQueue(que);
        printf("%d ", item);
    }
}

任务描述

本关任务:编写一个单链表循环队列,实现入队、出队操作,判断队空等特殊情况。

相关知识

为了完成本关任务,你需要掌握:1.单链表循环队列定义,2.入队、出队的定义,3.队空的情况。

单链表循环队列

单链表循环队列设一个尾指针rear,不设头指针。队尾添加数据的时候,只需要在rearrear->next之间插入该数据节点,然后将rear指向这个节点。因为没有头指针,所以添加一个整形变量size_来判定队列空的情况。

 
  1. struct Node // 数据节点
  2. {
  3. int data; // 数据类型
  4. Node *next; // 指向下一个节点的指针
  5. };
  6. struct CycleQueue // 循环链表队列
  7. {
  8. int size_; // 目前队列元素个数
  9. Node *rear; // 尾指针
  10. };

入队出队定义

注意初始队列时,尾指针rear = NULL以及rear->next = NULL

入队操作:

  • 为待入队元素创建数据节点Node* node
  • 如果队列为空,则尾节点指向新节点rear = noderear->next指向队首节点rear->next = node
  • 如果队列非空,则在rearrear->next之间插入新节点:
     
      
    1. Node *temp = rear->next;
    2. rear->next = node;
    3. node->next = temp;
    4. rear = node;
    5. rear->next = temp;

出队操作:队列不空,返回队首元素值。

  • 第一步:获取队首节点Node *node = rear->next;
  • 第二步:移除队首节点,修改rear->next = node->next

队空情况

队列中不含数据节点,通过变量size_来判定队列空的情况。

编程要求

本关的编程任务是补全右侧代码片段isEmptyenQueuedeQueueBeginEnd中间的代码,具体要求如下:

  • isEmpty中,判断队列是否为空,若空返回true并在一行打印The queue is Empty,否则返回false
  • enQueue中,实现入队操作:将元素item加入队列尾部;
  • deQueue中,实现出队操作:移除队列首部元素,并返回元素值。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:
7
enqueue 30
enqueue 98
dequeue
enqueue 96
dequeue
dequeue
enqueue 0
预期输出:
0 The queue is Empty

输入说明:
第一行m分别表示链队列入队出队操作记录数量。
接下来m行,enqueue表示入队操作,后面接待入队元素;dequeue表示出队操作。

输出说明:
输出m个操作之后的所有队列元素。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未闻花开_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值