队列(逻辑结构)
限制为有个端口进出元素,一个只管进,另一个只管出,就导致先进先出和特性。
队列与栈都是功能受限的表。
顺序队列、链式队列
顺序队列:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define TYPE int
typedef struct Queue//结构体
{
TYPE* base;
int size; // 容量
int head; // 队头
int tall; // 队尾
int cnt; // 数量
}Queue;
// 创建
Queue* creat_queue(int len);
// 销毁
void destory_queue(Queue* queue);
// 队空
bool empty_queue(Queue* queue);
// 队满
bool full_queue(Queue* queue);
// 入队
bool push_queue(Queue* queue,TYPE data);
// 出队
bool pop_queue(Queue* queue);
// 队头
TYPE* head_queue(Queue* queue);
// 队尾
TYPE* tall_queue(Queue* queue);
int main()
{
Queue* queue = creat_queue(10);
for(int i=0; i<15; i++)
{
printf("入队%s,",push_queue(queue,i)?"成功":"失败");
printf("队尾:%d\n",*tall_queue(queue));
}
printf("---------------------\n");
for(int i=0; i<5; i++)
{
printf("队头:%d,",*head_queue(queue));
printf("出队%s\n",pop_queue(queue)?"成功":"失败");
}
printf("---------------------\n");
for(int i=77; i<88; i++)
{
printf("入队%s,",push_queue(queue,i)?"成功":"失败");
printf("队尾:%d\n",*tall_queue(queue));
}
}
// 创建
Queue* creat_queue(int len)
{
Queue* queue = malloc(sizeof(Queue));
queue->base = malloc(sizeof(TYPE)*len);//首地址
queue->head = queue->cnt = 0;
queue->tall = -1;
queue->size = len;
return queue;
}
// 销毁
void destory_queue(Queue* queue)
{
free(queue->base);
free(queue);
}
// 队空
bool empty_queue(Queue* queue)
{
return !queue->cnt;
}
// 队满
bool full_queue(Queue* queue)
{
return queue->cnt >= queue->size;
}
// 入队
bool push_queue(Queue* queue,TYPE data)
{
// 判断是队满
if(full_queue(queue)) return false;
// 回头
queue->tall = (queue->tall+1) % queue->size;//容量一定,queue->tall+1不断加1,相余,余出的结果用于确定队尾位置
queue->base[queue->tall] = data;//入队
queue->cnt++;//数量自加1
return true;
}
// 出队
bool pop_queue(Queue* queue)
{
// 判断是否队空
if(empty_queue(queue)) return false;
// 回头
queue->head = (queue->head+1) % queue->size;
queue->cnt--;
return true;
}
// 队头
TYPE* head_queue(Queue* queue)
{
if(empty_queue(queue)) return NULL;//判断是否队空
return queue->base + queue->head;//首地址加偏移(队头的偏移),等于队头的地址
}
// 队尾
TYPE* tall_queue(Queue* queue)
{
if(empty_queue(queue)) return NULL;//判断是否队空
return queue->base + queue->tall;//同上
}
链式队列
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define TYPE int
typedef struct Node
{
TYPE data;
struct Node* next;
}Node;
Node* crete_node(TYPE data)
{
Node* node = malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
typedef struct Queue
{
Node* head;
Node* tail;
size_t size;
}Queue;
// 创建
Queue* creat_queue(void)
{
Queue* queue = malloc(sizeof(Queue));
queue->head = NULL;
queue->tail = NULL;
queue->size = 0;
return queue;
}
// 队空
bool empty_queue(Queue* queue)
{
return 0 == queue->size;
}
// 出队
bool pop_queue(Queue* queue)
{
if(empty_queue(queue)) return false;
Node* node = queue->head;
queue->head = node->next;
if(1 == queue->size) queue->tail = NULL;
free(node);
queue->size--;
return true;
}
// 销毁
void destory_queue(Queue* queue)
{
while(pop_queue(queue));
free(queue);
}
// 入队
void push_queue(Queue* queue,TYPE data)
{
Node* node = crete_node(data);
if(empty_queue(queue))
{
queue->head = node;
queue->tail = node;
}
else
{
queue->tail->next = node;
queue->tail = node;
}
queue->size++;
}
// 队头
TYPE* head_queue(Queue* queue)
{
if(empty_queue(queue)) return NULL;
return &queue->head->data;
}
// 队尾
TYPE* tail_queue(Queue* queue)
{
if(empty_queue(queue)) return NULL;
return &queue->tail->data;
}
int main()
{
Queue* queue = creat_queue();
for(int i=0; i<10; i++)
{
push_queue(queue,i);
printf("队尾:%d\n",*tail_queue(queue));
}
printf("--------------------\n");
for(int i=0; i<10; i++)
{
printf("队头:%d,",*head_queue(queue));
printf("出队%s\n",pop_queue(queue)?"成功":"失败");
}
}
- ps:今天杭州又又又满水,好臭啊啊啊啊啊!!!排水系统什么时候能弄好!可怜了我的新鞋子。