使用顺序存储实现队列
#define MaxSize 10 //定义队列中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //使用静态数组存放队列元素
int front,rear; //队头,队尾
}SqQueue;
基本操作
入队
//入队
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize==Q.front){
return false;
}
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;//强大的取模运算,有点循环队列的感觉吧
return true;
}
出队
//出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front){
return false;
}
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
获取队头元素
bool GetHead(SqQueue Q,ElemType &x){
if(Q.rear==Q.front){
return false;
}
x=Q.data[Q.front];
return true;
}
重点
- 理解模运算及其性质
- 如何初始化、入队、出队
- 如何判空、判满
- 如何计算队列的长度
代码示例
/**
* 顺序结构实现队列
* 特点:先进先出
* @author five-five
* @created 2022/5/18
*
*/
#include "stdlib.h"
#include "stdio.h"
#include "stdbool.h"
#define MAXSIZE 3 //最大长度
typedef struct {
int data[MAXSIZE]; //静态数组
int front; //队头
int rear; //队尾
/**
* 这里说明一点,做这一步是为了不使空间浪费,直接使用rear+1取模运算会浪费一个data[rear]的内存空间
*/
int tag; //记录操作,0为入队,1为出队
} SqQueue;
/**
* 初始化队列
* @param queue 队列指针的指针
* @return true?成功:失败
*/
bool initQueue(SqQueue **queue) {
*queue = (SqQueue *) malloc(sizeof(SqQueue));
if (*queue == NULL) {
return false;
}
(*queue)->front = 0;
(*queue)->rear = 0;
(*queue)->tag = 1;
return true;
}
/**
* 入队操作
* @param queue 队列指针
* @param data 要入队的数据
* @return true?成功:失败
*/
bool enQueue(SqQueue *queue, int data) {
if (queue == NULL) {
return false;
}
int i = (queue->rear + 1) % MAXSIZE;
if (queue->rear == queue->front && queue->tag == 0) {
return false;
}
queue->data[queue->rear] = data;
queue->rear = i;
queue->tag = 0;
return true;
}
/**
* 出队操作
* @param queue 队列指针
* @param e 用于接收出队元素的指针
* @return true?成功:失败
*/
bool deQueue(SqQueue *queue, int *e) {
if (queue == NULL) {
return false;
}
if (queue->rear == queue->front && queue->tag == 1) {
return false;
}
*e = queue->data[queue->front];
queue->front = (queue->front + 1) % MAXSIZE;
queue->tag = 1;
return true;
}
int main() {
SqQueue *queue;
int e = -1;
initQueue(&queue);
enQueue(queue, 1);
enQueue(queue, 2);
enQueue(queue, 3);
deQueue(queue, &e);
printf("%d\n", e);
enQueue(queue, 4);
deQueue(queue, &e);
printf("%d\n", e);
deQueue(queue, &e);
printf("%d\n", e);
deQueue(queue, &e);
printf("%d\n", e);
return 1;
}