队列

顺序循环队列

  • 在判断队空和队满时有3种方法,看教材
  • 这里列举其中一种
#pragma once

#include <stdio.h>

#define maxSize 100

typedef int ElemType;
typedef struct {
    int rear, front; //front指向队头第一个,rear指向队尾的下一个
    ElemType data[maxSize];
} SeqQueue;

//初始化
void initQueue(SeqQueue &q) {
    q.front = q.rear = 0;
}

//判断空
bool isEmpty(SeqQueue q) {
    return q.rear == q.front;
}

//入队
bool enQueue(SeqQueue &q, ElemType x) {
    if ((q.rear + 1) % maxSize == q.front) return false; //已满的情况
    q.data[q.rear] = x;
    q.rear %= maxSize;
    return true;
}

//出队
bool deQueue(SeqQueue &q, ElemType &x) {
    if (q.rear == q.front) return false;
    x = q.data[q.front];
    q.front = (q.front + 1) % maxSize;
    return true;
}

//获取队头元素
ElemType getTop(SeqQueue q) {
    if (q.rear == q.front) return false;
    return q.data[q.front];
}

//计算对内元素的个数
int getNum(SeqQueue q){
    return (q.rear + maxSize -q.front) % maxSize;
}

链式队列

#pragma once

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

typedef int ElemType;
typedef struct Node {
    ElemType data;
    struct Node *next;
} LinkNode;//强调的是节点

typedef struct {
    LinkNode *front, *rear;
} LinkQueue;//强调的是队列

//初始化
void initQueue(LinkQueue &q) {
    q.front = q.rear = (LinkNode *) malloc(sizeof(LinkNode));
    q.front->next = NULL;
}

//判断空
bool isEmpty(LinkQueue q) {
    return q.front == q.rear; //或者写q.front->next == NULL;
}

//入队(带头结点的)
void enQueue(LinkQueue &q, ElemType x) {
    LinkNode *p = (LinkNode *) malloc(sizeof(LinkNode));
    p->data = x;
    p->next = NULL;
    q.rear->next = p;
    q.rear = p;
}

//如果是无头节点的入队,需要判断处理一下对头
void enQueueNoHead(LinkQueue &q, ElemType x) {
    LinkNode *p = (LinkNode *) malloc(sizeof(LinkNode));
    p->data = x;
    p->next = NULL;
    //空队列的情况
    if (q.front == NULL) {
        q.rear = p;
        q.front = p;
    } else {
        q.rear->next = p;
        q.rear = p;
    }
}

//带头结点的出队
bool deQueue(LinkQueue &q, ElemType &x) {
    if (q.rear == q.front) return false;//队空
    LinkNode *p = q.front->next;
    x = p->data;
    q.front->next = p->next;
    //如果删除的是最后一个元素
    if (p == q.rear)//或者p == NULL
        q.rear == q.front;
    free(p);
    return true;
}

//不带多节点的出队
bool deQueueNoHead(LinkQueue &q, ElemType &x) {
    if (q.front == NULL) return false;
    LinkNode *p = q.front;
    x = p->data;
    q.front = p->next;
    if (q.rear == p) {//或者q.front == NULL
        q.front = NULL;
        q.rear = NULL;
    }
    free(p);
    return true;
}
posted @ 2020-08-28 18:30  JackpotNeaya  阅读(124)  评论(0编辑  收藏  举报