注:本文系岭南师范学院物联网俱乐部原创部分训练计划,转载请保留声明。
前言
前面跟大家讨论了堆栈的几种办法,如静态数组堆栈、动态数组堆栈和链表堆栈,今天主要跟大家讲一下队列的实现,队列是一种“先进先出的数据结构”,可分为静态队列和链式队列。链式队列则是通过尾插法实现,静态队列一般使用数组实现,数组需要预先定义内存大小,为了避免内存浪费,一般使用循环队列。
一、链式队列
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct queue
{
int value;
struct queue *next;
}queue_t;
queue_t *head;
queue_t *tail;
queue_t *prt;
unsigned int empty()
{
return head == NULL;
}
void add_queue()
{
queue_t *new_node;
for(int num=0;num<8;num++)
{
new_node = (queue_t*)malloc(sizeof(queue_t));
memset(new_node,0,sizeof(*new_node));
new_node->next=NULL;
new_node->value=num+1;
if(head == NULL )
{
head=new_node;
}
else
{
tail->next=new_node;
}
tail=new_node;
}
}
void delete_queue()
{
queue_t *first_node;
first_node = head;
head = first_node->next;
free(first_node);
if(head == NULL)
{
tail==NULL;
}
}
void destroy_queue()
{
if(!empty())
{
delete_queue();
}
}
int main()
{
printf("创建队列:");
add_queue();
for(prt=head;prt!=NULL;prt=prt->next)
{
printf("%d\n",prt->value);
}
printf("\n\n");
printf("删除队列");
for(int i=0;i<4;i++)
{
delete_queue();
}
for(prt=head;prt!=NULL;prt=prt->next)
{
printf("%d\n",prt->value);
}
printf("\n\n");
}
二、循环队列
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max_queue_num 10
typedef struct cir_queue
{
int front;
int rear;
char data[max_queue_num];
}queue_t;
void queue_init(queue_t *queue)
{
queue->front=0;
queue->rear=0;
memset(queue->data,0,max_queue_num);
}
int empty(queue_t *queue )
{
return (queue->front == queue->rear);
}
int full(queue_t *queue)
{
return(((queue->rear+1)%max_queue_num == queue->front));
}
void destroy_queue(queue_t *queue)
{
if(queue == NULL)
{
printf("队列不存在");
}
else
{
free(queue);
}
}
void add_queue(queue_t *queue , char newdata)
{
if(full(queue))
{
printf("队列已满!");
return ;
}
queue->data[queue->rear]=newdata;
queue->rear=(queue->rear+1)%max_queue_num;
}
void delete_queue(queue_t *queue)
{
if(empty(queue))
{
printf("队列为空!");
return ;
}
queue->front=(queue->front+1)%max_queue_num;
}
void queue_print(queue_t *queue)
{
for(int num=queue->front;num!=queue->rear;num=(num+1)%max_queue_num)
{
printf("%c\n",queue->data[num]);
}
}
int main()
{
queue_t *que=(queue_t*)malloc(sizeof(queue_t));
if(!que)
{
printf("malloc分配失败!");
}
queue_init(que);
printf("新建队列");
add_queue(que,'a');
add_queue(que,'b');
add_queue(que,'c');
queue_print(que);
printf("\n");
printf("删除队列");
delete_queue(que);
queue_print(que);
}
|