基本数据结构之队列
来源:互联网 发布:域名备案到期查询 编辑:程序博客网 时间: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
- 基本数据结构之队列
- 基本数据结构之队列
- 基本数据结构之队列
- 数据结构之队列基本实现
- “栈和队列”之队列--基本数据结构
- 数据结构——基本数据结构之队列
- 数据结构——基本数据结构之队列
- 基本数据结构之栈和队列
- “栈与队列”之栈--基本数据结构
- 【数据结构之链队列的基本运算】
- 数据结构之链表队列基本操作
- 基本数据结构之栈、队列、链表
- 数据结构之栈和队列---队列的基本操作
- 基本数据结构:链式队列
- 基本数据结构:链式队列
- 基本数据结构-队列
- 数据结构之栈和队列---栈的基本操作
- 数据结构之队列定义及基本操作实现
- How to determine the size of a class/struct in the C++?
- Metasploit 学习笔记
- 十六进制、八进制、二进制之间的转换
- errno是什么?
- 一个ANDROID开发菜鸟的BUNDLE与MAP理解
- 基本数据结构之队列
- OSG中LOD的使用
- 不能再挺着了
- extended initializer lists only available with -std=c++11
- 顶着台风,也要去参加的一次“磨课”
- mysql_fetch_array()与mysql_fetch_assoc()、mysql_fetch_row()
- [leetcode-]Climbing Stairs(C语言)
- 一个Servlet可以被映射成多个mapping
- 绿色mysql初始化以及遇到一些问题解决方法