队列的顺序存储与链式存储c语言实现

  • 2020 年 6 月 30 日
  • 筆記

一. 队列

1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表。

 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。

 

 

 循环队列状态:

    初始时:Q.front=Q.rear=0

    front指针移动:Q.front=(Q.front+1)%MaxSize

    rear指针移动:Q.rear=(Q.rear+1)%MaxSize

    队列长度:(Q.rear+MaxSize-Q.front)%MaxSize

    队空条件:Q.front=Q.rear

    队满条件:Q.front=Q.rear

3.区分队空和队满的三种处理

1)牺牲一个存储单元来区分队空和队满

    队满条件:(Q.rear+1)%MaxSize=Q.front

    队空条件:Q.front=Q.rear

    队中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize

2)类型中增设表示元素个数的数据成员

    队空条件:Q.front=Q.rear && Q.size=0

    队满条件:Q.front=Q.rear && Q.size=MaxSize

3)类型中增设tag数据成员,以区分队空还是队满

    tag=0时,若因删除导致Q.front=Q.rear,则为队空

    tag=1时,若因插入导致Q.front=Q.rear,则为队满

 

二. 循环队列的顺序存储操作

1.结构描述

typedef struct Queue{
    ElemType data[MaxSize];
    int front,rear,size;
}Queue;

2.初始化队列

Queue InitQueue()
 {
     Queue Q;
     Q.front=Q.rear=Q.size=0;
     return Q;
 }

3.判断队列是否为空

int Queue_Empty(Queue Q)
 {
     if(Q.front==Q.rear&&Q.size==0)
         return TRUE;
     else
         return FALSE;
 }

4.判断队列是否为满

int Queue_Full(Queue Q)
 {
     if(Q.front==Q.rear&&Q.size==MaxSize)
         return TRUE;
     else
         return FALSE;
 }

5.入队

int InQueue(Queue *q)
 {
     if(Queue_Full(*q))
         return FALSE;
     ElemType x;
     printf("输入入队元素:");
     scanf("%d",&x);
     q->data[q->rear]=x;
     q->rear=(q->rear+1)%MaxSize;
     q->size++;
     return TRUE;
 }

6.出队

int OutQueue(Queue *q,ElemType *x)
{
    if(Queue_Empty(*q))
        return FALSE;
    *x=q->data[q->front];
    q->front=(q->front+1)%MaxSize;
    q->size--;
    return TRUE;
}

7.完整代码

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MaxSize 10
typedef int ElemType;
typedef struct Queue{
    ElemType data[MaxSize];
    int front,rear,size;
}Queue;

Queue InitQueue();//初始化队列 
int Queue_Empty(Queue Q);//判断队列是否为空 ,用size来判断空还是满 
int Queue_Full(Queue Q);//判断队列是否满 
int InQueue(Queue *q);//入队
int OutQueue(Queue *q,ElemType *x);//出队,并记录出队元素 
int main()
{
    ElemType x;
    Queue Q=InitQueue();
    InQueue(&Q);
    InQueue(&Q);
    InQueue(&Q);
    InQueue(&Q);
    printf("此时队列长度:%d\n",Q.size);
    return 0;
 } 
 
 Queue InitQueue()
 {
     Queue Q;
     Q.front=Q.rear=Q.size=0;
     return Q;
 }
 
 int Queue_Empty(Queue Q)
 {
     if(Q.front==Q.rear&&Q.size==0)
         return TRUE;
     else
         return FALSE;
 }
 
 int Queue_Full(Queue Q)
 {
     if(Q.front==Q.rear&&Q.size==MaxSize)
         return TRUE;
     else
         return FALSE;
 }
 
 int InQueue(Queue *q)
 {
     if(Queue_Full(*q))
         return FALSE;
     ElemType x;
     printf("输入入队元素:");
     scanf("%d",&x);
     q->data[q->rear]=x;
     q->rear=(q->rear+1)%MaxSize;
     q->size++;
     return TRUE;
 }
 
int OutQueue(Queue *q,ElemType *x)
{
    if(Queue_Empty(*q))
        return FALSE;
    *x=q->data[q->front];
    q->front=(q->front+1)%MaxSize;
    q->size--;
    return TRUE;
}

View Code

运行示例:

 

 

 三. 队列的链式存储

链队列:同时带有队头指针和队尾指针的单链表。

 

1.结构描述

typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;

typedef struct Queue{
    struct Node *front,*rear;
}Queue;

2.链队列初始化

Queue InitQueue()
{
    Queue Q;
    Q.front=Q.rear=(Node*)malloc(sizeof(Node));
    Q.front->next=NULL;
    return Q;    
}

3.判断队列是否为空

int Queue_Empty(Queue Q)
{
    if(Q.front==Q.rear)
        return TRUE;
    else
        return FALSE;
}

4.入队

void InQueue(Queue *q)
{
    ElemType x;
    printf("输入入队元素:");
    scanf("%d",&x);
    Node *p=(Node*)malloc(sizeof(Node));
    p->data=x;
    p->next=NULL;
    q->rear->next=p;
    q->rear=p;
}

5.出队

int OutQueue(Queue *q,ElemType *x)
{
    if(Queue_Empty(*q))
    {
        return FALSE;
    }
    Node *p=q->front->next;
    *x=p->data;
    q->front->next=p->next;
    if(q->rear==p)
    {
        q->rear=q->front;
    }
    free(p);
    return TRUE;
}

6.完整代码

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;

typedef struct Queue{
    struct Node *front,*rear;
}Queue;

Queue InitQueue();//链队列初始化
int Queue_Empty(Queue Q);//判断队列是否为空 
void InQueue(Queue *q);//入队 
int OutQueue(Queue *q,ElemType *x);//出队 

int main()
{
    ElemType x;
    Queue Q=InitQueue();
    InQueue(&Q);
    InQueue(&Q);
    InQueue(&Q);
    OutQueue(&Q,&x);
    printf("出队元素:%d\n",x);
    return 0;
}

Queue InitQueue()
{
    Queue Q;
    Q.front=Q.rear=(Node*)malloc(sizeof(Node));
    Q.front->next=NULL;
    return Q;    
}

int Queue_Empty(Queue Q)
{
    if(Q.front==Q.rear)
        return TRUE;
    else
        return FALSE;
}

void InQueue(Queue *q)
{
    ElemType x;
    printf("输入入队元素:");
    scanf("%d",&x);
    Node *p=(Node*)malloc(sizeof(Node));
    p->data=x;
    p->next=NULL;
    q->rear->next=p;
    q->rear=p;
}

int OutQueue(Queue *q,ElemType *x)
{
    if(Queue_Empty(*q))
    {
        return FALSE;
    }
    Node *p=q->front->next;
    *x=p->data;
    q->front->next=p->next;
    if(q->rear==p)
    {
        q->rear=q->front;
    }
    free(p);
    return TRUE;
}

View Code

运行示例: