数据结构-队列

240 阅读2分钟

先简单聊聊

队列和栈类似,也是一种特殊的线性表,今天我们使用顺序存储的方式来实现一个循环队列。

队列是什么

队列是一种特殊的线性表,特殊点在于栈具有“先进先出”的一种形式。

1、何为先进先出

只在线性表的一端出队列(通常称为队列头或队头)、在另一端入队列(队列尾或队尾)。 直接上图

2、上代码

代码实现的是一个循环队列,注意是循环队列。其中会有需要的注意的点,请仔细查看代码注释

2.1、准备代码

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 5

typedef int Status;
typedef int ElemType;

typedef struct queue{
    ElemType data[MAXSIZE];
    int front;//队头
    int rear;//队尾
}Queue;

2.2、相关代码实现

// init
Status initQueue(Queue *queue) {
    queue->front = 0;
    queue->rear = 0;
    return OK;
}

//clear
Status clearQueue(Queue *queue) {
    queue->front = 0;
    queue->rear = 0;
    return OK;
}

//isEmpty
Status isEmpty(Queue queue) {
    if (queue.front == queue.rear) {
        return TRUE;
    } else {
        return FALSE;
    }
}

//length
int length(Queue queue) {
    //循环队列会有rear<front的情况,所以用取模的方式获取长度
    return (queue.rear - queue.front + MAXSIZE) % MAXSIZE;
}

//getHeader
Status getHeader(Queue queue, ElemType *elem) {
    if (isEmpty(queue)) {
        return ERROR;
    } else {
        *elem = queue.data[queue.front];
        return OK;
    }
}

//push
Status pushElem2Queue(Queue *queue, ElemType elem) {
    //和获取长度的方式类似,判断是否是满队列也需要用取模的方式处理
    if ((queue->rear + 1) % MAXSIZE == queue->front) {
        printf("is full queue\n");
        return ERROR;
    } else {
        queue->data[queue->rear] = elem;
        queue->rear = (queue->rear + 1) % MAXSIZE;
        return OK;
    }
}

//pop
Status popElemFromQueue(Queue *queue, ElemType *elem) {
    if (isEmpty(*queue)) {
        printf("is empty queue\n");
        return ERROR;
    } else {
        *elem = queue->data[queue->front];
        //这里也需要注意
        queue->front = (queue->front + 1) % MAXSIZE;
        return OK;
    }
}

//display
void display(Queue queue) {
    int i = queue.front;
    while (i % MAXSIZE != queue.rear) {
        printf("%d ", queue.data[i]);
        i++;
    }
    printf("\n");
}

2.3相关调用代码

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, Queue!\n");
    Queue q;
    Status iStatus;
    int l;
    initQueue(&q);
    iStatus = isEmpty(q);
    printf("is empty: %d\n", iStatus);
    l = length(q);
    printf("length: %d\n", l);
    
    iStatus = pushElem2Queue(&q, 1);
    iStatus = pushElem2Queue(&q, 2);
    iStatus = pushElem2Queue(&q, 3);
    iStatus = pushElem2Queue(&q, 4);
    iStatus = pushElem2Queue(&q, 5);
    display(q);
    
    printf("pop\n");
    ElemType elem;
    iStatus = popElemFromQueue(&q, &elem);
    display(q);
    iStatus = popElemFromQueue(&q, &elem);
    display(q);
    iStatus = popElemFromQueue(&q, &elem);
    display(q);
    iStatus = popElemFromQueue(&q, &elem);
    display(q);
    
    return 0;
}

2.4、打印结果

Hello, Queue!
is empty: 1
length: 0
is full queue
1 2 3 4 
pop
2 3 4 
3 4 
4 

is empty queue

Program ended with exit code: 0

链式存储方式的队列

参考下一篇文章数据结构-队列-链式存储