队列的实现

栈的实现:https://blog.csdn.net/q496958148/article/details/80040641
官方给的定义:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

俗称“先进先出”。
同样的我们还是用顺序表和链表实现队列。(其实和栈差不多)

顺序表:

seqqueue.h:

#pragma once

#include <stdio.h>
#include <stdlib.h>

typedef char DataType;

//定义队列的最大容量
#define seqqueueMaxSize 100

#define LINE printf("----------------%s----------------\n",__FUNCTION__);

//队列的结构体
typedef struct seqqueue{
    DataType arr[seqqueueMaxSize];
    size_t size;
}seqqueue;

void seqqueueInit(seqqueue* pstack);

void seqqueuePush(seqqueue* pstack,DataType value);

void seqqueuePop(seqqueue* pstack);

void seqqueueDelete(seqqueue* pstack);

DataType seqqueueGetTop(seqqueue* pstack);

seqqueue.c:

#pragma once

#include <stdio.h>
#include <stdlib.h>

typedef char DataType;

//定义队列的最大容量
#define seqqueueMaxSize 100

#define LINE printf("----------------%s----------------\n",__FUNCTION__);

//队列的结构体
typedef struct seqqueue{
    DataType arr[seqqueueMaxSize];
    size_t size;
}seqqueue;

void seqqueueInit(seqqueue* pstack);

void seqqueuePush(seqqueue* pstack,DataType value);

void seqqueuePop(seqqueue* pstack);

void seqqueueDelete(seqqueue* pstack);

DataType seqqueueGetTop(seqqueue* pstack);
[test@localhost seqqueue]$ cat seqqueue.c
#include "seqqueue.h"

//初始化
void seqqueueInit(seqqueue* phead)
{
    if(phead == NULL)
    {
        return;
    }
    phead->size = 0;
}

//入队列
void seqqueuePush(seqqueue* phead,DataType value)
{
    if(phead == NULL)
    {

        return;
    }
    //满了
    if(phead->size >= seqqueueMaxSize)
    {
        printf("stack is full!\n");
        return;
    }
    phead->arr[phead->size] = value;
    ++phead->size;
}

//出队列
void seqqueuePop(seqqueue* phead)
{
    if(phead == NULL)
    {
        return;
    }
    //空队列
    if(phead->size == 0)
    {
        printf("this stack is null!\n");
        return;
    }
    int i = 0;
    for(;i<(phead->size)-1;i++)
    {
        phead->arr[i] = phead->arr[i+1];
    }
    --(phead->size);
}

//销毁队列
void seqqueueDelete(seqqueue* phead)
{
    if(phead == NULL)
    {
        return;
    }
    phead->size = 0;
    phead = NULL;
}

//去队列第一个元素
DataType seqqueueGetTop(seqqueue* phead)
{
    if(phead == NULL)
    {
        return;
    }
    //空队列
    if(phead->size == 0)
    {
        printf("this is stack is null!\n");
        return;
    }
    return phead->arr[0];
}

//----------------------------------------------------------------
//-----------测试函数
//----------------------------------------------------------------

//打印函数
void seqqueuePrint(seqqueue* phead,char*msg)
{
    if(phead == NULL)
    {
        return;
    }
    printf("%s\n",msg);
    printf("      队列头\n");
    int i = 0;
    for(;i < phead->size;i++)
    {
        printf("[%c|%p]\n",phead->arr[i],&(phead->arr[i]));
    }
    printf("      队列尾\n");
}

void testseqqueue()
{
    LINE;
    seqqueue phead;
    seqqueueInit(&phead);

    seqqueuePush(&phead,'a');
    seqqueuePush(&phead,'b');
    seqqueuePush(&phead,'c');
    seqqueuePush(&phead,'d');
    seqqueuePush(&phead,'e');
    seqqueuePrint(&phead,"入队列5个");

    LINE;
    seqqueuePop(&phead);
    seqqueuePop(&phead);
    seqqueuePrint(&phead,"出队列2个");

    LINE;
    DataType cur = seqqueueGetTop(&phead);
    printf("取队列第一个元素\n");
    printf("[%c]\n",cur);
}

int main()
{
    testseqqueue();
    return 0;
}

效果图:
这里写图片描述

链表:

linkqueue.h:

#pragma once

#include <stdio.h>
#include <stdlib.h>

#define LINE printf("-------------%s--------------\n",__FUNCTION__);

typedef char LinkType;

typedef struct linkqueue{
    LinkType data;
    struct linkqueue* next;
}linkqueue;

void linkqueueInit(linkqueue** phead);

linkqueue* CreateNode(LinkType value);

void linkqueuePush(linkqueue** phead,LinkType value);

void linkqueuePop(linkqueue** phead);

void linkqueueDelete(linkqueue* phead);

LinkType linkqueueGetTop(linkqueue* phead);

linkqueue.c:

#include "linkqueue.h"

//初始化
void linkqueueInit(linkqueue** phead)
{
    //因为我传的是二级指针,所以只需要判断phead是否合法即可,初始化只需把头指向空即可。
    if(phead == NULL)
    {
        //非法输入
        return;
    }
    *phead = NULL;
}

//创建节点
linkqueue* CreateNode(LinkType value)
{
    //切记malloc之后得写一个free
    linkqueue* new_node = (linkqueue*)malloc(sizeof(linkqueue));
    if(new_node == NULL)
    {
        //malloc创建失败
        perror("malloc");
        return NULL;
    }
    new_node->next = NULL;
    new_node->data = value;
    return new_node;
}

//销毁节点free
void DeleteNode(linkqueue* node)
{
    free(node);
    //为了指针的安全性,销毁完空间后,记得将指针指向空
    node = NULL;
}

//入队列,相当与链表的尾插
void linkqueuePush(linkqueue** phead,LinkType value)
{
    if(phead == NULL)
    {
        //非法输入
        return;
    }
    if(*phead == NULL)
    {
        //空队列,直接插入就行
        *phead = CreateNode(value);
        return;
    }
    linkqueue* new_node = CreateNode(value);
    if(new_node == NULL)
    {
        return;
    }
    linkqueue* cur = *phead;
    while(cur->next != NULL)
    {
        cur = cur->next;
    }
    cur->next = new_node;
}

//出队列,相当与链表的头删
void linkqueuePop(linkqueue** phead)
{
    if(phead == NULL)
    {
        //非法输入
        return;
    }
    if(*phead == NULL)
    {
        //已经是空队列了
        return;
    }
    linkqueue* to_delete = *phead;
    *phead = (*phead)->next;
    DeleteNode(to_delete);//记得销毁指针
}

//取得队列第一个元素
LinkType linkqueueGetTop(linkqueue* phead)
{
    if(phead == NULL)
    {
        //空队列
        return 0;
    }
    return phead->data;
}

//-----------------------------------------------------------
//----------测试函数
//-----------------------------------------------------------

//打印函数
void linkqueuePrint(linkqueue* phead,char* msg)
{
    if(phead == NULL)
    {
        //空队列
        return;
    }
    printf("%s\n",msg);
    printf("   队列头\n");
    linkqueue* cur = phead;
    while(cur != NULL)
    {
        printf("[%c|%p]\n",cur->data,&(cur->data));
        cur = cur->next;
    }
    printf("   队列尾\n");
}

void testlinkqueuePush()
{
    LINE;
    linkqueue* phead = NULL;
    linkqueueInit(&phead);

    linkqueuePush(&phead,'a');
    linkqueuePush(&phead,'b');
    linkqueuePush(&phead,'c');
    linkqueuePush(&phead,'d');
    linkqueuePush(&phead,'e');
    linkqueuePrint(phead,"入队列5个!");
}

void testlinkqueuePop()
{
    LINE;
    linkqueue* phead = NULL;
    linkqueueInit(&phead);

    linkqueuePush(&phead,'a');
    linkqueuePush(&phead,'b');
    linkqueuePush(&phead,'c');
    linkqueuePush(&phead,'d');
    linkqueuePush(&phead,'e');

    linkqueuePop(&phead);
    linkqueuePop(&phead);
    linkqueuePrint(phead,"出队列2个!");
}

void testlinkqueueGetTop()
{
    LINE;
    linkqueue* phead = NULL;
    linkqueueInit(&phead);

    linkqueuePush(&phead,'a');
    linkqueuePush(&phead,'b');
    linkqueuePush(&phead,'c');
    linkqueuePush(&phead,'d');
    linkqueuePush(&phead,'e');

    linkqueuePrint(phead,"取队列第一个元素");
    LinkType ch = linkqueueGetTop(phead);
    printf("第一个元素:%c\n",ch);
}

int main()
{
    testlinkqueuePush();
    testlinkqueuePop();
    testlinkqueueGetTop();
    return 0;
}

效果图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值