队列的基本操作

队列是链表的一种形式,队列具有先进先出(FIFO)的特性,即使用队列时,插入在一端进行,而删除在另一端进行。

队列的基本操作是Enqueue(入队),他是在表的末尾(rear)插入一个元素,还有Dequequ(出队),即删除(或返回)在表的开头(队头,front)的元素。

队列可以使用链表或者数组来实现。基本的操作示例如下:

链表实现:

#include <stdlib.h>
#include <stdio.h>

typedef int elemType;

struct Node
{
    elemType data; //值域
    Node * next;//链接指针
};

struct queueLK
{
    Node *front;  //队首指针
    Node *rear; //队尾指针
};

//初始化链队
void initQueueLK(queueLK *hq)
{
    hq->front = hq->rear = NULL; //把队首、队尾指针置空
    return;

}

//向链队中插入一个元素X
void enQueue(queueLK *hq, elemType x)
{
    //得到一个由newP指针所指向的新节点
    Node *newP;
    newP = (Node*)malloc(sizeof(Node));
    if (newP == NULL)
    {
        printf("内存空间分配失败\n");
        exit(1);
    }
    //把X的值赋给新节点,吧新节点的指针域置空
    newP->data = x;
    newP->next = NULL;

    //若链队为空,则新节点即是队首又是队尾
    if(hq->rear == NULL)
        hq->front = hq->rear = newP;
    else
        hq->rear = hq->rear->next = newP; //注意赋值顺序
    return;
}

//从队列中删除一个元素
elemType outQueue(queueLK *hq)
{
    Node *p;
    elemType temp;

    //若链表为空,停止运行
    if (hq->front == NULL)
    {
        printf("队列为空,无法删除\n");
        exit(1);
    }

    temp = hq->front->data; //暂存队尾元素以便返回
    p = hq->front;  //暂存队首指针以便回收队尾节点
    hq->front = p->next; //队首指针指向下一个节点

    //若删除后链队为空,则需同时将队尾指针置空
    if(hq->front == NULL)
        hq->rear = NULL;
    free(p); //回收原队首节点
    return temp; //返回呗删除的队首元素值
}

//读取队首元素值
elemType peekQueue(queueLK *hq)
{
    //若链队为空,停止运行
    if (hq->front == NULL)
    {
        printf("链队为空,退出程序\n");
        exit(1);
    }
    return hq->front->data; //返回队首元素
}

//检测链队是否为空,空返回1,否则为0
int emptyQueue(queueLK *hq)
{
    //判断队首或队尾任一个指针是否为空即可
    if (hq->front == NULL)
        return 1;
    else
        return 0;
}


//清除链队所有元素
void clearQueue(queueLK *hq)
{
    if (hq->front == NULL)
    {
        printf("链表为空,退出运行\n");
        exit(1);
    }
    Node *p = hq->front; //队首指针赋给p
    //依次删除队列中的每一个节点,最后使队首指针为空
    while (p != NULL)
    {
        hq->front = hq->front->next;
        free(p);
        p = hq->front;
    }
    hq->rear = NULL; //置队尾指针为空
    printf("清除链表元素成功\n");
    return;
}

int main()
{
    queueLK q;
    int a[8] = {3, 8, 5, 17, 9, 30, 15, 22};
    int i;
    initQueueLK(&q);
    for ( i = 0; i < 8; i++)
    {
        enQueue(&q, a[i]);
    }
    printf("%d\n", outQueue(&q));
    enQueue(&q,68);
    printf("%d\n", outQueue(&q));
    while(!emptyQueue(&q))
    {
        printf("%d\t", outQueue(&q));
    }
    printf("\n");
    clearQueue(&q);

    system("pause");
    return 0;
}

数组实现:

#include <stdio.h>
#include <stdlib.h>

#define QUEUE_SIZE 50

typedef struct SeqQueue
{
    int data[QUEUE_SIZE];
    int front;
    int rear;

}Queue;

//初始化队列
void initQueue( Queue *q)
{
    if (q == NULL)
    {
        printf("队列为空,退出程序\n");
        exit(1);
    }
    q->front = NULL;
    q->rear = NULL;
}

//判断队列是否为满
int isFull(Queue * q)
{
    return ((q->rear + 1) % QUEUE_SIZE == q->front);
}

//判断队列是否为空
int isEmpty(Queue *q)
{
    return (q->front == q->rear);
}

//删除队列元素
int deQueue(Queue *q)
{
    if(isEmpty(q)) 
    {
        printf("队列为空,无法删除,退出程序\n");
        exit(1);
    }
    int temp = q->data[q->front];
    q->front = (q->front +1) %QUEUE_SIZE;
    return temp;
}

//向队列中添加元素X
void enQueue(Queue *q, int x)
{
    if (isFull(q))
    {
        printf("队列已经满,无法添加,退出程序\n");
        exit(1);
    }
    q->data[q->rear] = x;
    q->rear = (q->rear + 1) %QUEUE_SIZE;

}

void clearQueue(Queue *q)
{
    if (isEmpty(q))
    {
        printf("队列已经为空,退出程序\n");
        exit(1);
    }
    q->front = q->rear = 0;
    printf("清空队列完毕\n");
}

int main()
{
    Queue *q = (Queue *) malloc(sizeof (Queue));
    initQueue(q);
    int i;
    for (i = 0; i < 10; i++)
    {
        enQueue(q, i);
        printf("%d\t",i);
    }
    printf("\n");
    /*while (!isEmpty(q))
    {
        int data = deQueue(q);
        printf("%d\t", data);
    }*/

    clearQueue(q);
    deQueue(q);//验证是否清空队列

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值