005-数据结构和算法-顺序队列

2020-04-12  本文已影响0人  沉默Coder

队列的基本结构

队列的逻辑结构

队列是一种插入只能在队尾,删除只能在队头的线性表,队列的出队需要遵循“先进先出”的原则。

因为队列是一种线性表,所以和线性表一样,队列的物理存储方式也有:
-顺序存储
-链式存储
两种方式。(栈和队列一样都是一种逻辑结构,物理存储的方式并不会影响队列的逻辑规则)。

接下来我们具体研究一下队列的具体实现:

采用顺序存储的方式实现一个队列

顺序存储,顾名思义就是开辟一段连续的存储空间来存储队列中的元素

一些提前定义的参数

#define ERROR 0
#define OK 1
#define MAXSIZE 20

typedef int Status;
typedef int Element;

顺序队列的结构

typedef struct
{
    Element data[MAXSIZE];
    int front;//队头
    int rear; //队尾
} SQueue;

队列的初始化

//初始化队列
Status createQueue(SQueue * sq)
{
    sq->front = sq->rear = 0;
    return OK;
}

清空队列

//清空队列
Status clearQuque(SQueue * sq)
{
    sq->front = sq->rear = 0;
    return OK;
}
//队列是否为空
Status isEmptyQueue(SQueue sq)
{
    return sq.front == sq.rear;
}
//队列的长度
int queueLength(SQueue sq)
{
    if(isEmptyQueue(sq)) return 0;
    
    return (sq.rear + MAXSIZE - sq.front)%MAXSIZE;
}
//获取队头
Status sqFrontElement(SQueue sq,Element *e)
{
    if(isEmptyQueue(sq)) return ERROR;
    
    *e = sq.data[sq.front];
    return OK;
}
//是否队满
Status isQueueFull(SQueue sq)
{
    return (sq.rear + 1)%MAXSIZE == sq.front;
}
//入队
Status inQueue(SQueue *sq,Element e)
{
    //判断是否队满
    if((sq->rear + 1)%MAXSIZE == sq->front) return ERROR;
    
    sq->data[sq->rear] = e;
    sq->rear = (sq->rear + 1)%MAXSIZE;
    return OK;
}
//出队
Status outQueue(SQueue *sq, Element * e)
{
    //队列为空
    if(isEmptyQueue(*sq)) return ERROR;
    
    *e = sq->data[sq->front];
    sq->front = (sq->front + 1)%MAXSIZE;
    return OK;
}
// 遍历队列
Status queueTrace(SQueue sq)
{
    if(isEmptyQueue(sq))
    {
        printf("队列为空\n");
        return ERROR;
    }
    printf("队列元素: ");
    int p = sq.front;
    while (p != sq.rear) {
        printf("%d ",sq.data[p]);
        p = (p + 1) %MAXSIZE;
    }
    printf("\n\n");
    
    return OK;
}

测试

int main(int argc, const char * argv[]) {
    // insert code here...
    
    SQueue sq;
    
    createQueue(&sq);
    for (int i = 1; i <= 20; i++) {
        inQueue(&sq, i);
    }
    queueTrace(sq);
    
    printf("是否为空: %d\n",isEmptyQueue(sq));
    printf("是否队满: %d\n",isQueueFull(sq));
    printf("队列长度: %d\n",queueLength(sq));
    
    Element e;
    outQueue(&sq, &e);
    queueTrace(sq);
    
    printf("出队\n");
    for (int i = 0; i < 10; i++) {
        outQueue(&sq, &e);
    }
    queueTrace(sq);
    printf("队列长度: %d\n",queueLength(sq));
    
    printf("入队\n");
    for (int i = 20; i < 30; i++) {
        inQueue(&sq, i);
    }
    queueTrace(sq);
    printf("队列长度: %d\n",queueLength(sq));
    
    return 0;
}
输出结果
上一篇 下一篇

猜你喜欢

热点阅读