提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
C语言顺序存储队列
一、什么是队列的顺序存储
1、队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。
2、使用数组来存取队列元素的结构叫队列的顺序存储结构。
3、假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即为对头。
(1)入队,就是在队尾追加一个元素,不需要移动任何元素,所以时间复杂度为O(1).
(2)出队是在队头,即下标为0的位置,也就意味着,队列中的所有位置都得向前移动,以保证下标为0的位置,即对头不为空。此时时间复杂度为O(n)。
二、程序
#include <stdio.h>
#include <stdlib.h>
#include "./seq_queue.h"
//队列结构体
typedef struct
{
int size; //元素个数
int data[MAX]; //队列
} SeqQueue;
//初始化
SeqQueue *init_queue(void);
//入队
void push_queue(SeqQueue *queue, int data);
//出队
void pop_queue(SeqQueue *queue);
//获取队头元素
int get_front_data(SeqQueue *queue);
//获取队尾元素
int get_back_data(SeqQueue *queue);
//获取元素个数
int get_size(SeqQueue *queue);
//清空
void empty_queue(SeqQueue *queue);
//销毁
void destroy_queue(SeqQueue *queue);
//初始化
SeqQueue *init_queue(void)
{
SeqQueue *my_queue = (SeqQueue *)calloc(1, sizeof(SeqQueue));
return my_queue;
}
//入队
void push_queue(SeqQueue *queue, int data)
{
if (queue == NULL)
{
return;
}
queue->data[queue->size] = data;
queue->size++;
}
//出队
void pop_queue(SeqQueue *queue)
{
if (queue == NULL)
{
return;
}
if (queue->size == 0)
{
return;
}
for (int i = 1; i < queue->size; i++)
{
queue->data[i - 1] = queue->data[i];
}
queue->size--;
}
//获取队头元素
int get_front_data(SeqQueue *queue)
{
if (queue == NULL)
{
printf("错误\r\n");
return -1;
}
if (queue->size == 0)
{
printf("队为空\r\n");
return 0;
}
return queue->data[0];
}
//获取队尾元素
int get_back_data(SeqQueue *queue)
{
if (queue == NULL)
{
printf("错误\r\n");
return -1;
}
if (queue->size == 0)
{
printf("队为空\r\n");
return 0;
}
return queue->data[queue->size - 1];
}
//获取元素个数
int get_size(SeqQueue *queue)
{
if (queue == NULL)
{
printf("错误\r\n");
return -1;
}
return queue->size;
}
//清空
void empty_queue(SeqQueue *queue)
{
if (queue == NULL)
{
return;
}
while (queue->size)
{
pop_queue(queue);
}
}
//销毁
void destroy_queue(SeqQueue *queue)
{
if (queue == NULL)
{
return;
}
free(queue);
}
int main(int argc, char const *argv[])
{
SeqQueue *my_queue = init_queue();
push_queue(my_queue, 10);
push_queue(my_queue, 20);
push_queue(my_queue, 30);
push_queue(my_queue, 40);
push_queue(my_queue, 50);
printf("队头元素 = %d\r\n", get_front_data(my_queue));
printf("队尾元素 = %d\r\n", get_back_data(my_queue));
printf("元素个数 = %d\r\n", get_size(my_queue));
pop_queue(my_queue);
pop_queue(my_queue);
printf("队头元素 = %d\r\n", get_front_data(my_queue));
printf("队尾元素 = %d\r\n", get_back_data(my_queue));
printf("元素个数 = %d\r\n", get_size(my_queue));
empty_queue(my_queue);
printf("元素个数 = %d\r\n", get_size(my_queue));
destroy_queue(my_queue);
my_queue = NULL;
return 0;
}
运行结果:
队头元素 = 10
队尾元素 = 50
元素个数 = 5
队头元素 = 30
队尾元素 = 50
元素个数 = 3
元素个数 = 0