南昌网站推广公司网络推广软文范文
一个循环队列的C语言实现,数据类型Queue
定义如下,注意在 typedef struct{...}Queue;
中Queue为数据类型,而在struct {...}Queue;
中Queue为一个变量名。
front
为队首元素下标,始终指向队首元素,tail
为队尾元素的下一个位置的下标。初始状态为front=tail=0
typedef struct {int size,eleNum;int* array;int front,tail; //front指向第一个元素,rear指向最后一个元素的下一个位置
} Queue;
基本操作有:
add()
, 添加元素到队尾
peek()
, 获取但并不移出头
poll()
, 获取并移出队首元素
create(n)
, 创建大小为n的队列
isempty()
, 判断队列是不是空
另外,队列操作函数的参数都为指针,这样可以实现模拟引用传递的效果,如果参数为add(Queue q,int n)
, 对队列的修改并不会影响到初始的队列。可以修改运行试一下。
代码实现如下:
#include<stdio.h>#include<stdlib.h>/*用c语音实现队列基本操作add(), 添加元素到队尾peek(), 获取但并不移出头poll(), 获取并移出队首元素create(n), 创建大小为n的队列isempty(), 判断队列是不是空*/typedef struct {int size,eleNum;int* array;int front,tail; //front指向第一个元素,rear指向最后一个元素的下一个位置} Queue;//取出并移除第一个元素int poll(Queue* q){int res = q->array[q->front];q->front = (++(q->front))%q->size;q->eleNum--;return res;}//获取长度int len(Queue* q){return q->eleNum;}//插入k,返回1表示插入成功int add(Queue* q,int k){if(q->size==q->eleNum){return 0;}q->eleNum++;q->array[q->tail] = k;q->tail = (q->tail+1) % q->size;return 1;}//取出头部元素,不删除此元素,peek是“偷看”的意思int peek(Queue* q){return q->array[q->front];}//返回1表示为空,0表示不空int isEmpty(Queue* q){if(q->eleNum==0){return 1;}return 0;}//创建大小为n的队列Queue* createQue(int n){Queue* que = (Queue*)malloc(sizeof(Queue));que->size = n;que->eleNum = 0;que->array = (int*)malloc(sizeof(int)*n);que->front = 0;que->tail = 0;return que;}void display(Queue* q){int i = q->front;printf("elements: ");while(i!=q->tail){printf("%d ",q->array[i]);i = (i+1)%q->size;}printf("\n");printf("size: %d,elements num: %d\n",q->size,q->eleNum);printf("front: %d, tail:%d \n",q->front,q->tail);}int main(){Queue* q = createQue(10);add(q,10); add(q,11); add(q,12);poll(q); poll(q);display(q);return EXIT_SUCCESS;}