基本数据结构之队列

来源:互联网 发布:域名备案到期查询 编辑:程序博客网 时间:2024/05/14 02:31

栈的C语言实现

#include <stdlib.h>#include <stdio.h>#include <stdbool.h>#include <string.h>typedef int queue_elem;//数据类型/** * @author 韦轩 * @time 2015/07/11 * @brief  * @队列的基本数据类型 */typedef struct queue_t{    int front; //队头    int rear; //队尾    int capacity;// 容量    queue_elem* element;//存储数组}queue_t;/** * @author 韦轩 * @time 2015/07/11 * @brief 创建一个队列 * @param capacity 容量 * @return 返回创建的queue对象的指针 */queue_t* queue_create(int capacity){    queue_t* q = (queue_t*)malloc(sizeof(queue_t));    q->capacity = capacity;    q->front = 0;    q->rear = 0;    q->element = (queue_elem*)malloc(capacity*sizeof(queue_elem));    return q;}/** * @author 韦轩 * @time 2015/07/11 * @brief 销毁栈 * @param  * @return 无 *   */void queue_destroy(queue_t *q){    if (q==NULL)        return;    free(q->element);    free(q);}/** * @author 韦轩 * @time 2015/07/11 * @brief 判断栈是否为空 * @param  * @return 返回true 如果是空,否则false *   */bool queue_empty(const queue_t *q){    return q->front == q->rear;}/** * @author 韦轩 * @time 2015/07/11 * @brief 队列的大小  * @param  * @return 返回队列的大小 *   */int queue_size(const queue_t *q){    return (q->rear - q->front + q->capacity) % q->capacity;}/** * @author 韦轩 * @time 2015/07/11 * @brief 在队尾添加元素 * @param q 指向当前队列的指针 * @param x 要添加的元素 * @return 无 *   */void queue_push(queue_t *q, const queue_elem x){    if (q == NULL)        return;    //已满,重新分配内存    if (((q->rear + 1) % q->capacity) == q->front)    {        queue_elem* temp = (queue_elem*)malloc(q->capacity * 2 * sizeof(queue_elem));        if (q->front < q->rear)        {            memcpy(temp, q->element + q->front, (q->rear - q->front)* sizeof(queue_elem));            q->rear -= q->front;            q->front = 0;        }        else if (q->front > q->rear)         {            /* 拷贝q->front 到q->capacity 之间的数据*/            memcpy(temp, q->element + q->front,                (q->capacity - q->front) * sizeof(queue_elem));            /* 拷贝q->data[0] 到q->data[rear] 之间的数据*/            memcpy(temp +(q->capacity - q->front),q->element, q->rear * sizeof(queue_elem));            q->rear += q->capacity - q->front;            q->front = 0;        }        free(q->element);        q->element = temp;        q->capacity *= 2;    }    q->element[q->rear] = x;    q->rear = (q->rear + 1) % q->capacity;}/** * @author 韦轩 * @time 2015/07/11 * @brief  在队头删除元素 * @param  * @return 无 *   */void queue_pop(queue_t *q){    q->front = (q->front + 1) % q->capacity;}/** * @author 韦轩 * @time 2015/07/11 * @brief 获取队首元素 * @param  * @return 返回队首元素 *   */queue_elem queue_front(const queue_t *q){    return q->element[q->front];}/** * @author 韦轩 * @time 2015/07/11 * @brief 获取队尾元素 * @param  * @return 返回队尾元素 *   */queue_elem queue_back(const queue_t *q){    return q->element[q->rear-1];}/** * @author 韦轩 * @time 2015/07/11 * @brief 打印栈的元素 * @param  * @return *   */void queue_print(const queue_t *q){    if (q == NULL)        return;    for (int i = 0; i<queue_size(q);i++)    {        printf_s("%d\t", q->element[i]);    }    printf_s("\n");}int main(){    queue_t* q = queue_create(6);    queue_push(q,2);    queue_push(q,3);    queue_push(q,5);    queue_push(q,10);    printf_s("queue_front = %d\n", queue_front(q));    printf_s("queue_back = %d\n", queue_back(q));    queue_print(q);    queue_pop(q);    printf_s("queue_front= %d\n",queue_front(q));    queue_destroy(q);    return 0;}

杨辉三角的实现

#include <iostream>#include <queue>/** * @author 韦轩 * @time 2015/07/11 * @brief 打印杨辉三角 * 分行打印二项式(a+b)^n 展开式的系数。在输出上一行系数的同时, * 将其下一行的系数预先计算好,放入队列中。在各行系数之间插入一个0。 * @param n (a+b)^n 表示第n层 * @return *   */void yanghui_triangle(const int n){    std::queue<int> q;    int i = 1;    q.push(i); //预先放入第一列    for (i = 0; i <= n;i++)    {        int s = 0;        q.push(s); //在各行之间插入0        //处理第i行的i+2个系数        for (int j = 0; j < i + 2; j++)        {            int temp = 0, t = 0;            t = q.front();            q.pop();            temp = s + t;            q.push(temp);            s = t;            if (j != i + 1)                printf("%d ", s);        }        printf("\n");    }}int main(){    yanghui_triangle(5);    return 0;}

队列的特点

  • 队列的get和push操作是常量级别的
0 0
原创粉丝点击