队列的基本概念
队列 (Queue) :是一种先进先出 (First In First Out ,简称 FIFO) 的线性表。只允许在表的一端进行插入,而在另一端进行删除。
队首 (front) :允许进行删除的一端称为队首。
队尾 (rear) :允许进行插入的一端称为队尾。
基本操作
void queue_init(queue *q);//初始化void queue_en(queue *q,DataType data);//入队列
void queue_de(queue *q);//出队列
int queue_Empty(queue *q);//队列判空
void get_head(queue *q);//获取队头元素
void queue_print(queue *q);//打印队列
void queue_clear(queue *q);//队列清空
queue.h
#pragma once #define MAX_QUEUE 100 typedef int DataType; typedef struct queue { DataType _arr[MAX_QUEUE]; int _front; int _rear; }queue; void queue_init(queue *q);//初始化 void queue_en(queue *q,DataType data);//入队列 void queue_de(queue *q);//出队列 int queue_Empty(queue *q);//队列判空 void get_head(queue *q);//获取队头元素 void queue_print(queue *q);//打印队列 void queue_clear(queue *q);//队列清空
queue.c
#include<stdio.h> #include"queue.h" void queue_init(queue *q) { //构造一个空队列 q->_front = q->_rear = 0; printf("初始化已完成!\n"); } void queue_en(queue *q,DataType data) { if(q->_rear == MAX_QUEUE) { printf("队列已满!\n"); return; } q->_arr[q->_rear] = data; printf("元素%d入队\n",q->_arr[q->_rear]); q->_rear +=1; } void queue_de(queue *q)//出队列 { if(!queue_Empty(q)) { printf("队列为空"); return ; } printf("元素%d出队\n",q->_arr[q->_front]); q->_front += 1; } int queue_Empty(queue *q) { if(q->_front == q->_rear) { printf("队列为空"); return 0; } return 1; } void get_head(queue *q)//获取队头元素 { if(!queue_Empty(q)) { printf("队列为空"); return ; } printf("对头元素为:%d\n",q->_arr[q->_front]); } void queue_print(queue *q) { int i = 0; if(q->_front == q->_rear) { printf("队列为空!\n"); return; } printf("开始打印:\n"); for(i = q->_front;i<q->_rear;i++) { printf("%d ",q->_arr[i]); } printf("\n"); } void queue_clear(queue *q) { q ->_front = q ->_rear = 0; } int main() { queue q; queue_init(&q); queue_en(&q,1); queue_en(&q,2); queue_en(&q,3); queue_print(&q); queue_de(&q); queue_print(&q); get_head(&q); return 0; }
队列的链式表示和实现
队列的链式存储结构简称为链队列,它是限制仅在表头进行删除操作和表尾进行插入操作的单链表。
给队列添加一个头结点,并令头指针指向头结点
queue.h
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<malloc.h> typedef int DataType; typedef struct q_node { DataType _data; struct q_node *next; }q_node,*link_node; typedef struct queue { q_node* front; q_node* rear; }queue; void queue_init(queue *q);//队列初始化 void queue_en(queue *q , int data);//入队列 void queue_de(queue *q);//出队列 int queue_Empty(queue *q);//队列判空 void get_front(queue *q);//获取队头 void queue_print(queue *q);//打印队列 void queue_destroy(queue *q);//销毁队列
queue.c
#include"queue.h" void queue_init(queue *q) { q->front = (q_node*)malloc(sizeof(q_node)); if(q->front != NULL) { q->rear = q->front; q->front->next = NULL; } printf("初始化成功!\n"); } void queue_en(queue *q , int data) { link_node new_node = (link_node)malloc(sizeof(q_node)); if(!new_node) { printf("内存分配失败在\n"); return ; } new_node ->_data = data; new_node ->next = NULL; q->rear->next = new_node; q->rear = q->rear->next; printf("%d入队\n",q->rear->_data); } void queue_de(queue *q) { link_node del_node = NULL; assert(q); if(q->front ==q->rear) { printf("队列为空\n"); return ; } printf("%d出队\n",q->front->next->_data); del_node = q->front->next; q->front->next = del_node ->next; free(del_node); } int queue_Empty(queue *q) { assert(q); if(q->front == q->rear) { printf("队列为空\n"); return 0; } return 1; } void get_front(queue *q) { if (q -> front == q -> rear) { return ; } printf("队头为:%d\n",q->front->next->_data); } void queue_print(queue *q) { link_node p = q->front->next; printf("队列为:\n"); if(!p) { printf("队列为空\n"); return; } while(p) { printf("%d\n",p->_data); p = p->next; } } void queue_destroy(queue *q) { while(q->rear) { free(q); q->front->next; } }
test
#include"queue.h" test() { queue q; queue_init(&q); queue_en(&q , 1); queue_en(&q , 2); get_front(&q); queue_de(&q); get_front(&q); queue_en(&q , 3); queue_print(&q); } int main() { test(); system("pause"); return 0; }