队列
1.队列的定义
队列是只运行在一端进行插入,另一端进行删除的线性表。
先进先出(FIFO)
2.队列的抽象数据结构
ADT 队列
Data
同线性表
Operation
InitQueue(*Q);//初始化队列
DestroyQueue(*Q);//销毁队列
ClearQueue(*Q);//清空队列
IsEmpty(*Q);//队列是否为空
EnQueue(*Q,e);//入队
DeQueue(*Q,*e);//出队
GetHead(*Q,*e);//获取队头元素
GetLength(*Q);//获取队列长度
3.循环队列-顺序存储
#include <stdio.h>
#include <windwos.h>
#define MAXSIZE 30
#define ERROR 0
#define OK 1
//循环队列的顺序存储结构
typedef struct SqQueue
{
int data[MAXSIZE];
int front;//头指针
int rear;//尾指针
}SqQueue;
//初始化循环队列
void InitQueue(SqQueue *Q)
{
Q->data[MAXSIZE]= {0};
Q->front = 0;
Q->rear = 0;
}
//获取队列长度
int GetLength(SqQueue *Q)
{
return (Q->rear-Q->front+MAXSIZE)%MAXSIZE;
}
//入队
int EnQueue(SqQueue *Q,int e)
{
if((Q->rear+1)%MAXSIZE == Q->front)//队列满的判断
{
printf("队列已满,无法入队\n");
return ERROR;
}
Q->data[Q->rear]=e;//入队
Q->rear=(Q->rear+1)%MAXSIZE;//注意这里不是Q->rear++
return OK;
}
int DeQueue(SqQueue *Q,int *e)
{
if(Q->rear == Q->front)//队列为空
{
printf("队列为空,无法出队\n");
return ERROR;
}
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
}
4.队列的链式存储
#include <stdio.h>
#include <windwos.h>
#define ERROR 0
#define OK 1
//结点
typedef struct Node
{
int data;
struct Node *next;
} Node;
//循环队列的链表存储结构
typedef struct LinkQueue
{
Node* front;//头指针
Node* rear;//尾指针
}LinkQueue;
//初始化循环队列
void InitQueue(LinkQueue *Q)
{
Q->front = NULL;
Q->rear = NULL;
}
//入队
int EnQueue(LinkQueue *Q,int e)
{
Node* s = (Node*)malloc(sizeof(Node));
if(s == NULL)//分配内存失败
{
printf("分配内存失败,无法入队\n");
return ERROR;
}
s->data = e;
s->next = NULL;
Q->rear->next = s;//把s赋给原队尾的后继结点
Q->rear = s; //rear指向s 队尾
return OK;
}
int DeQueue(LinkQueue *Q,int *e)
{
if(Q->front == Q->rear)
{
printf("队列为空,无法出队\n");
return ERROR;
}
Node * p = Q->front->next;//指向第一个节点
*e = p->data;//被删除的元素
Q->front->next = p->next;//删除第一个节点
if(Q->rear == p)
Q->front == Q->rear;
free(p);
return OK;
}
网友评论