栈的实现: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;
}
效果图: