循环队列实现K阶斐波那契数列求值

概述

K阶斐波那契数列:数列第1项到第k-1项为0,第k项为1,之后从第(k+1)项开始每一项为前k项之和。

循环队列

定义结构体中front指示队头位置,rear指示队尾位置,初始空队时Q->front = Q->rear = 0,队满时(Q->rear + 1) % Q->k = Q->front,即头尾指针指向同一位置。若队列未满时,新元素入队将尾指针后移一位;若队列不为空时,出队时将头指针后移一位。详细介绍参考博客:数据结构 | 循环队列(基本操作及图示)

具体实现

因此,使用循环队列实现K阶斐波那契数列求值时,先定义一个容量为k(k为阶数)的循环队列,将第1项至第k-1项为0、第k项为1加入队列,之后每次对队内元素求和将其值加入队列,随后将队顶元素出队,直至队内剩下序列中最后k项。

代码

typedef struct {
    int *base;
    int front; // 头指针
    int rear; // 尾指针
    int k; // 阶数
}Queue;

Queue* InitQueue(int k) {
    Queue *Q;
    Q = (Queue*)malloc(sizeof(Queue));
    Q->k = k + 1;
    Q->base = (int*)malloc(sizeof(int) * Q->k);
    Q->front = Q->rear = 0;
    return Q;
}

void EnQueue(Queue *Q, int item) {
    // 若队满
    if((Q->rear + 1) % Q->k == Q->front) {
        return;
    }
    // 移动尾指针加入队列
    else {
        Q->rear = (Q->rear + 1) % Q->k;
        Q->base[Q->rear] = item;
    }
}

void DeQueue(Queue *Q) {
    // 若队空
    if(Q->rear == Q->front){
        return;
    }
    // 移动头指针出队
    else {
        Q->front = (Q->front + 1) % Q->k;
    }
}

// 求队列中元素之和
int SumQueue(Queue *Q) {
    int sum;
    for(int i = 0; i < Q->k; i++) {
        sum += Q->base[i];
    }
    return sum;
}

/*K阶斐波那契数列:数列第1项到第k-1项为0,第k项为1,之后从第(k+1)项开始每一项为前k项之和。*/
void Fibonacci(int k, int max) {
    Queue *q;
    int item, num = 0;
    q = InitQueue(k);
    for(int i = 0; i < k; i++) {
        if(i == k - 1)
            EnQueue(q,1);
        else
            EnQueue(q,0);
    }
    while(num <= max){
        num = SumQueue(q);
        DeQueue(q);
        EnQueue(q,num);
    }
}

你可能感兴趣的:(数据结构,循环链表,K阶斐波那契数列,数据结构)