从0开始——线性表的应用:队列

队列

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 
#include 

#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 
#include 

#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;
} 

你可能感兴趣的:(从0开始——线性表的应用:队列)