队列
队列是一种先入先出的数据结构
栈需要两个标志位 :
队头标志位 front
队尾标志位 rear
实现方式:
1 通过数组
2 通过链表
顺序队列
内存结构图
通过数组实现:数组元素是有限的,入队和出队要考虑到满和空的情况
另外,需要两个下标front和rear 来标记队列的头尾的位置
循环数组实现方式是 : 下标%数组长度
注意:
| 1 | 顺序队列的实际可存入数据大小是 = 数组长度 - 1 |
|---|---|
| 2 | 规定 :front 和 rear 相等时 队列为空 |
| 3 | 规定 :front 的对应位置不存数据 那么队列第一个元素 == ( front+1)%数组长度 |
1、空顺序队列
2、入队列(push)
3、出队列 (pop)
.h文件
#ifndef _QUEUE_H_
#define _QUEUE_H_
#define QUEUE_SIZE 10
typedef enum{FALSE,TRUE} BOOL;
typedef int Data;
typedef struct _queue
{
Data data[QUEUE_SIZE]; //队列大小
int front; //队头
int rear ; //队尾
}Queue;
//初始化空队列
void Init_Queue(Queue*q);
//判断满队列
BOOL IsFull(Queue*q);
//入队列
void Push(Queue*q,Data data);
//判断空队列
BOOL IsEmpty(Queue*q);
//出队列
void Pop(Queue*q);
//获取队头元素
Data Gettop(Queue*q);
//打印队列数据
void Display(Queue*q);
#endif//_QUEUE_H_
.c文件
#include "Queue.h"
#include <stdlib.h>
#include <stdio.h>
void Init_Queue(Queue*q)
{
if(NULL == q)
return ;
q->front = 0;
q->rear = 0;
}
BOOL IsFull(Queue*q)
{
if(NULL == q)
return ;
if((q->rear+1)%QUEUE_SIZE == q->front)
return TRUE;
return FALSE;
}
void Push(Queue*q,Data data)
{
if(NULL == q)
return ;
if(IsFull(q) == TRUE)
return ;
q->rear = (q->rear+1)%QUEUE_SIZE;
q->data[q->rear] = data;
}
BOOL IsEmpty(Queue*q)
{
if(NULL == q)
return ;
if(q->front == q->rear)
return TRUE;
return FALSE;
}
void Pop(Queue*q)
{
if(NULL == q)
return ;
if(IsEmpty(q) == TRUE)
return ;
q->front = (q->front+1)%QUEUE_SIZE;
}
Data Gettop(Queue*q)
{
if(NULL == q)
return ;
if(IsEmpty(q) == TRUE)
exit(-1) ;
return q->data[(q->front+1)%QUEUE_SIZE];
}
void Display(Queue*q)
{
while(!IsEmpty(q))
{
printf("%d\n",Gettop(q));
Pop(q);
}
printf("顺序队列打印结束并置空队列!!!!\n");
}
链式队列
内存结构图
.h文件
#ifndef _QUEUE_H_
#define _QUEUE_H_
typedef enum{FALSE,TRUE} BOOL;
typedef int Data;
typedef struct _node
{
Data data; //节点数据
struct _node *next ; //指针域 指向下一个节点
}Node;
typedef struct _queue
{
Node *front;
Node *rear;
}Queue;
//初始化空队列
void Init_Queue(Queue*q);
//判断空队列
BOOL IsEmpty(Queue*q);
//入队列
void Push(Queue*q,Data data);
//出队列
void Pop(Queue*q);
//获取队头元素
Data GetFront(Queue*q);
//打印队列数据
void Display_Queue(Queue*q);
#endif//_QUEUE_H_
.c文件
#include "Queue.h"
#include <stdlib.h>
#include <stdio.h>
void Init_Queue(Queue*q)
{
if(NULL == q)
return ;
q->front = NULL;
q->rear = NULL;
}
BOOL IsEmpty(Queue*q)
{
if(NULL == q)
return ;
if(NULL == q->front)
return TRUE;
return FALSE;
}
void Push(Queue*q,Data data)
{
if(NULL == q)
return ;
Node *new_node =(Node*)malloc(sizeof(Node)/sizeof(char));
if(NULL == new_node)
{
return ;
}
new_node->data = data;
new_node->next = NULL;
if(!IsEmpty(q))//非空队列
{
q->rear ->next = new_node;
q->rear = new_node;
}
else//空队列
{
q->front = new_node;
q->rear = new_node;
}
}
void Pop(Queue*q)
{
if(NULL == q)
return ;
if(IsEmpty(q) == TRUE)
return ;
Node *tmp = q->front;
if(q->front->next != NULL)//队列 > 1个节点
{
q->front = tmp->next;
}
else//队列 = 1个节点
{
q->front = NULL;
q->rear = NULL;
}
free(tmp);
}
Data GetFront(Queue*q)
{
if(NULL == q)
return ;
if(IsEmpty(q) == TRUE)
exit(-1) ;
return q->front->data;
}
void Display_Queue(Queue*q)
{
while(!IsEmpty(q))
{
printf("%-4d",GetFront(q));
Pop(q);
}
printf("\n");
printf("队列打印结束并置空栈!!!!\n");
}