c语言静态数组创建队列

来源:互联网 发布:linux扩大home分区 编辑:程序博客网 时间:2024/05/22 19:15

    关于队列的接口名称并没有统一的约定,具体的方法也没有严格的限制,这里使用在队列头部删除,在队列尾部加入新元素的方法,

   关于接口的定义如下:

  •  insert()    表示插入到队列头部
  •  delete()   表示从队列尾部删除数组
  •  is_full()    判断队列是否为满
  •  is_empty() 判断队列是否为空
  •  first()       获得队列的头部元素
  •  last()        获得队列尾部元素
  •  queue_size()  获得已使用队列的长度

              

queue.h

#ifndef QUEUE_H#define QUEUE_H#include <stdio.h>#define QUEUE_TYPEint /*define the type of the queue*//**create queue *only for dynamic_shuzu_queue */void create_queue(size_t size);/**destory_queue*only for list_queue and dynamic_shuzu_queue*/void destory_queue(void);//insertvoid insert(QUEUE_TYPE value);//deletevoid delete(void);//firstQUEUE_TYPE first(void);//lastQUEUE_TYPE last(void);//queue_sizeint queue_size(void);//is_emptyint is_empty(void);//is_fullint is_full(void);#endif /*QUEUE_H*/


queue.c

#include <stdio.h>#include "queue.h"#include <assert.h>/* *使用循环数组带来了队列空与队列满时front和rear相同的问题*解决方法一:定一个变量queue_size用来记录数据的长度**解决方法二:使用循环数组不填满的技术,保持数组中始终有一个元素不使用,rear从比front小1的位置开始,最大到循环位置中front的前2个位置*   即:空为(rear+1)%QUEUE_SIZE==front满为(rear+2)%QUEUE_SIZE==front*/#define QUEUE_SIZE 10#define ARRAY_SIZE (QUEUE_SIZE+1) static QUEUE_TYPE  queue[ARRAY_SIZE];static int front=1;static int rear=0;//insertvoid insert(QUEUE_TYPE value){assert(!is_full());rear=(++rear)%ARRAY_SIZE;queue[rear]=value;}//deletevoid delete(void){assert(!is_empty());front=(++front)%ARRAY_SIZE;}//firstQUEUE_TYPE first(void){assert(!is_empty());return queue[front];}//lastQUEUE_TYPE last(void){assert(!is_empty());return queue[rear];}//queue_sizeint queue_size(void){if(is_empty()){return 0;}else if(rear>=front){return rear+1-front;}else{return ARRAY_SIZE-front+rear+1;}}//is_emptyint is_empty(void){return (rear+1)%ARRAY_SIZE==front;}//is_fullint is_full(void){return  (rear+2)%ARRAY_SIZE==front;}


queuetest.h

/**测试循环数组队列*/#include <stdio.h>#include "queue.h"void main(){int i=0;for(i=1;i<=11;i++){printf("queue size: %2ld\n",queue_size());if(is_full()){printf("the queue is full now!\n");break;}insert(i);printf("front : %2ld\trear: %2ld \n",first(),last());}       for(i=1;i<=11;i++){printf("queue size: %2ld\n",queue_size());if(is_empty()){printf("the queue is empty now!\n");break;}printf("front : %2ld\trear: %2ld \n",first(),last());delete();}}

运行编译命令: gcc  -o  queuetest  queue.c  queuetest.c
运行结果:
queue size:  0front :  1rear:  1 queue size:  1front :  1rear:  2 queue size:  2front :  1rear:  3 queue size:  3front :  1rear:  4 queue size:  4front :  1rear:  5 queue size:  5front :  1rear:  6 queue size:  6front :  1rear:  7 queue size:  7front :  1rear:  8 queue size:  8front :  1rear:  9 queue size:  9front :  1rear: 10 queue size: 10the queue is full now!queue size: 10front :  1rear: 10 queue size:  9front :  2rear: 10 queue size:  8front :  3rear: 10 queue size:  7front :  4rear: 10 queue size:  6front :  5rear: 10 queue size:  5front :  6rear: 10 queue size:  4front :  7rear: 10 queue size:  3front :  8rear: 10 queue size:  2front :  9rear: 10 queue size:  1front : 10rear: 10 queue size:  0the queue is empty now!



原创粉丝点击