队列
来源:互联网 发布:数据库crow s foot图 编辑:程序博客网 时间:2024/06/09 20:22
队列是一种先进先出的数据结构。
1、用数组实现循环队列,用Q[N]来实现一个最多容纳n-1个元素的队列。Q.head指向队列头元素,Q.tail指向下个新元素要插入的位置
1)Q.head==Q.tail 时,队列为空
2)Q.head==Q.tail+1 时,队列满
#include <stdio.h>#include <assert.h>//#include <stdlib.h>#define max 5#define type int/*typedef struct queue{type data[max];struct queue * head;struct queue * tail;}queue;*/static type queue[max];int head;int tail;void queue_insert(type);void queue_delete();int isfull();int isempty();void queue_print();int main(){head=tail=0;queue_insert(1);queue_insert(2);queue_insert(3);queue_insert(4);queue_insert(5);queue_print();printf("-------------\n");queue_delete();queue_delete();queue_print();printf("--------------\n");return 0;}int isempty(){return head==tail?1:0 ;}int isfull(){return (tail+1)%max==head ?1:0; }void queue_insert(type value){//assert(!isfull());if(!isfull()){queue[tail]=value;tail=(tail+1)%max;//printf("%d\n",value);}elseperror("insert faiture!\n");}void queue_print(){int i;assert(!isempty());//for(i=head;(i)%max!=tail;i++)//tail指向空位置 i++错误,可能引起越界for(i=head;(i)%max!=tail;i=(i+1)%max)printf("%d%c",queue[i],(i+1)%max==tail?'\n':' ');}void queue_delete(){assert(!isempty());head=(head+1)%max;}
2、动态数组实现队列
#include <stdio.h>#include <assert.h>#include <stdlib.h>#define type intstatic type *queue;static int size;static int head;static int tail;int isempty();int isfull();void creat_queue();void queue_insert(type value);void queue_delete();void queue_print();int main(){head=tail=0;creat_queue();queue_insert(1);queue_insert(2);queue_insert(3);queue_insert(4);queue_insert(5);queue_print();printf("----------------------\n");queue_delete();queue_delete();queue_print();printf("----------------------\n");queue_insert(3);//queue_insert(4);queue_insert(5);queue_print();printf("----------------------\n");return 0;}int isempty(){return head==tail?1:0;}int isfull(){return (tail+1)%size==head?1:0 ;}void queue_insert(type value){if(!isfull()){queue[tail]=value;printf("insert %d successfully\n",queue[tail]);tail=(tail+1)%size;}elseperror("queue is full\n");}void queue_print(){int i;for(i=head;(i%size)!=tail;i=(i+1)%size)printf("%d%c",queue[i],(i+1)%size==tail?'\n':' ');}void creat_queue(){printf("please input the size of queue:\n");scanf_s("%d",&size);queue=(type*)malloc(sizeof(type)*size);assert(queue!=NULL);}void queue_delete(){assert(!isempty());head=(head+1)%size;}
3、链表实现队列
对于链表实现的队列,插入元素用 尾插法,删除元素在头部删除。
#include <stdio.h>#include <stdlib.h>#include <assert.h>#define type intstatic int count=0;typedef struct qnode{type data;struct qnode * next;}qnode;struct qnode * head=0;struct qnode * tail=0;int isempty();int isfull();void queue_insert(type);void queue_delete();void destroy();void queue_print();int main(){queue_insert(1);queue_insert(2);queue_insert(3);queue_insert(4);queue_print();printf("------------\n");queue_delete();queue_delete();queue_print();printf("------------\n");queue_insert(1);queue_insert(2);queue_insert(3);queue_insert(4);queue_print();destroy();return 0;}void queue_insert(type value){struct qnode* cur;if(!isfull()){cur=(qnode *)malloc(sizeof(struct qnode));assert(cur!=NULL);cur->data=value;if(head==NULL){head=cur;tail=cur;}else{tail->next=cur;tail=cur;}count++;}}int isfull(){return 0;}int isempty(){return head==NULL?1:0;}void queue_print(){struct qnode* cur;assert(!isempty());for(cur=head;cur!=tail;cur=cur->next)printf("%d ",cur->data);printf("%d\n",cur->data);}void queue_delete(){struct qnode * cur;if(!isempty()){if(head==tail){head=tail=NULL;return ;}cur=head;head=cur->next;free(cur);}}void destroy(){struct qnode* cur;struct qnode* del;assert(!isempty());for(del=head;del!=tail;del=cur){cur=del->next;queue_delete();}if(del==tail)queue_delete();}
0 0
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- SAS学习笔记(四)——关于数据整合的几个细节
- The j.u.c Synchronizer Framework翻译
- kinect for windows - DepthBasics-D2D详解之一
- 使用mediainfo库取得媒体文件的tag
- ExtJs开发工具 sencha破解方法
- 队列
- mysql正则匹配介绍
- iOS 画布:画线条
- 六款常用的linux C/C++ IDE
- frame,iframe,frameset的用法和区别
- Source Insight的一点小技巧
- 数据通信与网络六——数据链路层控制
- 移动开发者必须了解的10大跨平台工具
- 根据包名获取应用程序基本信息