算法与数据结构(c语言)——顺序队列存储结构及实现

使用循环队列,避免出现伪满队列的情况

  • 判断队列为空的条件:rear == front;
  • 判断队列为满的条件:(rear+1)%MAXSIZE == front;

空出一个数组元素空间,用以区别开来满队列和空队列。

 

一个顺序队列的结构: 

typedef struct{
    // 定义一个数组用来存储所有的数据元素
    Element data[MAXSIZE];
    // 第一个元素下标
    int front;
    // 最后一个元素的下标
    int rear;
}SqQueue;

对顺序队列的操作:

// 初始化一个线性表
SqQueue* InitSQueue(){
    SqQueue *sq = (SqQueue *)malloc(sizeof(SqQueue));

    if(!sq){
        exit(0);
    }
    sq->front = 0;
    sq->rear = 0;

    return sq;
}

// 判断是否为空的队列
bool SQueueEmpty(SqQueue *sq){
    return sq->rear == sq->front;
}
// 是否为满的队列
bool SQueueFull(SqQueue *sq){
    return (sq->rear+1)%MAXSIZE == sq->front;
}

Status EnSQueue(SqQueue *sq,Element v){
    // 判断队列是否已满
    if(SQueueFull(sq)){
        return ERROR;
    }

    // 进队列,插入数据后队尾指针后移
    sq->data[sq->rear] = v;
    sq->rear = ++sq->rear%MAXSIZE;
    return OK;
}
Status DeSQueue(SqQueue *sq,Element *v){
    // 判断队列是否是空队列
    if(SQueueEmpty(sq)){
        return ERROR;
    }
    // 出队列,取出数据后队头指针后移
    *v = sq->data[sq->front];
    sq->front = ++sq->front%MAXSIZE;
    return OK;
}

// 打印队列
void PrintSQueue(SqQueue *sq){
    if(!SQueueEmpty(sq)){
        printf("栈内的元素依次是:[");
        for (int i = sq->front; i!=sq->rear; i = (i+1)%MAXSIZE) {
            printf("%d",sq->data[i]);
            if((i+1)%MAXSIZE != sq->rear){
                printf(", ");
            }
    }
    printf("]\n");
    }
}

测试代码:

int TestSQueue(){
    SqQueue *sq = InitSQueue();
    SQueueCreate(sq,5);
    Element a;
    Element *resP;
    resP = &a;
    DeSQueue(sq,resP);
    printf("%d 元素出队列\n",*resP);

    EnSQueue(sq,5);
        printf("元素入队列\n");
    DeSQueue(sq,resP);
        printf("%d 元素出队列\n",*resP);
    DeSQueue(sq,resP);
        printf("%d 元素出队列\n",*resP);
    EnSQueue(sq,6);
        printf("元素入队列\n");
    EnSQueue(sq,7);
        printf("元素入队列\n");
    DeSQueue(sq,resP);
        printf("%d 元素出队列\n",*resP);
    PrintSQueue(sq);
    return 0;
}

运行结果:

算法与数据结构(c语言)——顺序队列存储结构及实现_第1张图片

你可能感兴趣的:(线性表,队列)