美文网首页
队列(Queue)

队列(Queue)

作者: fastcv | 来源:发表于2019-08-09 00:43 被阅读0次

队列

队列(Queue)是另外一种限定性的线性表,它只允许在表的一端插入元素,而在另外一端删除元素,所有队列具有先进先出(First In First Out,FIFO)的特性。这和我们日常生活的排队一样。在队列中,允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)。

链队列

定义一个结点

LinkQueue.h

#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_
typedef struct Node
{
    int data;   //数据域 
    Node *next;   //指针域 
}Node,*LinkQueueNode; 
typedef struct Queue
{
    LinkQueueNode front;
    LinkQueueNode rear;
}*LinkQueue;
LinkQueue InitQueue(LinkQueue);
bool IsEmpty(LinkQueue);
bool EnterQueue(LinkQueue,int*);
bool DeleteQueue(LinkQueue,int*);
bool GetHead(LinkQueue,int*);
void ClearQueue(LinkQueue);
#endif

实现相应的方法

LinkQueue.cpp

#include <stdio.h>
#include "LinkQueue.h"
#include <malloc.h>
LinkQueue InitQueue(LinkQueue Q)
{
    Q = (LinkQueue)malloc(sizeof(Queue));
    Q->front = (LinkQueueNode)malloc(sizeof(Node));
    printf("InitQueue success!1!\n");
    if(Q->front!=NULL)
    {
        Q->rear = Q->front;
        Q->front->next = NULL;
    }
    printf("InitQueue success!!\n");
    return Q;
}
bool IsEmpty(LinkQueue Q)
{
    if(Q->front->next == NULL)
    {
        return true;
    }else{
        return false;
    } 
}
bool EnterQueue(LinkQueue Q,int x)
{
    LinkQueueNode node;
    node = (LinkQueueNode)malloc(sizeof(LinkQueueNode));
    if(node != NULL)
    {
        node->data = x;
        node->next = NULL;
        Q->rear->next = node;
        Q->rear= node;
        printf("Enter Queue Success!!\n") ;
        return true;
    }else{
        printf("Enter Queue Failed!!\n") ;
        return false;
    }
}
bool DeleteQueue(LinkQueue Q,int *x)
{
    LinkQueueNode p;
    if(Q->front == Q->rear)
         return false;
    p = Q->front->next;
    Q->front->next = p->next;
    if(Q->rear == p){
        Q->rear = Q->front;
    }
    
    *x = p->data;
    free(p);
    return true;
}
bool GetHead(LinkQueue Q,int *x)
{
    if(Q->front == Q->rear)
    {
        return false;
    }else{
        LinkQueueNode node = Q->front->next;
        *x = node->data; 
        return true;
    }
}
void ClearQueue(LinkQueue Q)
{
    LinkQueueNode p,q;
    p = Q->front->next;
    while(p != NULL)
    {
        q = p->next;
        free(p);
        p = q;
    }
    printf("clear cpmplete!!\n");
     
}

运行

LinkQueueMain.cpp

#include <stdio.h>
#include "LinkQueue.cpp"
int main(void)
{
    LinkQueue Q;
    Q = InitQueue(Q);
    if(IsEmpty(Q)){
        printf("队列为空\n");
    }else{
        printf("队列不为空"); 
    }
    EnterQueue(Q,11);
    if(IsEmpty(Q)){
        printf("队列为空\n");
    }else{
        printf("队列不为空"); 
    }
    
    int value;
    GetHead(Q,&value);
    printf("队列头部的数字为%d\n",value);
    DeleteQueue(Q,&value);
    printf("出队列的数字为%d\n",value);
    if(IsEmpty(Q)){
        printf("队列为空\n");
    }else{
        printf("队列不为空"); 
    }
    ClearQueue(Q); 
}

运行结果:

InitQueue success!1!
InitQueue success!!
队列为空
Enter Queue Success!!
队列不为空队列头部的数字为11
出队列的数字为11
队列为空
clear cpmplete!!

--------------------------------
Process exited with return value 0
Press any key to continue . . .

相关文章

  • 循环队列的实现方法1

    设:队列长度是QUEUE_LENGTH队列数组是queue[QUEUE_LENGTH]队列头索引是head队列尾索...

  • Java—Queue队列详解

    Queue Queue队列介绍   Queue是用于模拟队列的,啥叫队列?队列就是排队的意思,比如排队结账,先进入...

  • Java—Queue队列详解(Deque/PriorityQue

    Queue Queue队列介绍   Queue是用于模拟队列的,啥叫队列?队列就是排队的意思,比如排队结账,先进入...

  • Queue模块

    一、class Queue.Queue 类 Queue类表示使用FIFO队列 Queue.qsize()返回队列的...

  • 多线程GCD

    1:GCD 创建队列: 串行队列: dispatch_queue_t queue=dispatch_queue_c...

  • 第三周_总结

    队列创建一个队列:queue_obj = queue.Queue(maxsize=30)maxsize :表示允许...

  • GCD 多线程的使用

    1.串行队列 1.1串行队列创建 dispatch_queue_t queue = dispatch_queue_...

  • GCD

    dispatch_queue_t:线程、队列dispatch_queue_create(派发队列)派发队列分为两种...

  • GCD队列queue.h__queue

    队列queue.h方法总览 创建队列(queue)相关方法: 举例说明:

  • GCD相关

    创建队列 dispatch_queue_create("我是串行队列",DISPATCH_QUEUE_SERIAL...

网友评论

      本文标题:队列(Queue)

      本文链接:https://www.haomeiwen.com/subject/szmqjctx.html