栈的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)
{
memcpy(temp, q->element + q->front,
(q->capacity - q->front) * sizeof(queue_elem));
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>
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);
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;
}
队列的特点