2.2 先进先出结构:队列

2-8SeqQueue.h

 1 //顺序队列操作
 2 #define QUEUEMAX 15
 3 typedef struct
 4 {
 5     DATA data[QUEUEMAX]; //队列数组
 6     int head; //队头
 7     int tail; //队尾
 8 }SeqQueue;
 9 SeqQueue *SeqQueueInit()
10 {
11     SeqQueue *q;
12     if(q=(SeqQueue *)malloc(sizeof(SeqQueue))) //申请保存队列的内存
13     {
14         q->head = 0;//设置队头
15         q->tail = 0;//设置队尾
16         return q;
17     }else
18         return NULL; //返回空
19 }
20 void SeqQueueFree(SeqQueue *q) //释放队列
21 {
22     if (q!=NULL)
23         free(q);
24 }
25 int SeqQueueIsEmpty(SeqQueue *q)  //队列是否为空
26 {
27     return (q->head==q->tail);
28 }
29 int SeqQueueIsFull(SeqQueue *q)//队列是否已满
30 {
31     return (q->tail==QUEUEMAX);
32 }
33 int SeqQueueLen(SeqQueue *q) //获取队列长度
34 {
35     return(q->tail-q->head);
36 }
37 int SeqQueueIn(SeqQueue *q,DATA data)//顺序队列的入队函数
38 {
39     if(q->tail==QUEUEMAX)
40     {
41         printf("队列已满!\n");
42         return(0);
43     }else{
44         q->data[q->tail++]=data;
45         return(1);
46     }
47 }
48 DATA *SeqQueueOut(SeqQueue *q)//顺序队列的出队
49 {
50     if(q->head==q->tail)
51     {
52         printf("\n队列已空!\n");
53         return NULL;
54     }else{
55         return &(q->data[q->head++]);
56     }
57 }
58 DATA *SeqQueuePeek(SeqQueue *q) //获取队头元素
59 {
60     if(SeqQueueIsEmpty(q))
61     {
62         printf("\n队列为空!\n");
63         return NULL;
64     }else{
65         return &(q->data[q->head]);
66     }
67 } 

2-9 CycQueue.h

 1 //循环队列
 2 #define QUEUEMAX 15
 3 typedef struct
 4 {
 5     DATA data[QUEUEMAX]; //队列数组
 6     int head; //队头
 7     int tail; //队尾
 8 }CycQueue;
 9 CycQueue *CycQueueInit()
10 {
11     CycQueue *q;
12     if(q=(CycQueue *)malloc(sizeof(CycQueue))) //申请保存队列的内存
13     {
14         q->head = 0;//设置队头
15         q->tail = 0;//设置队尾
16         return q;
17     }else
18         return NULL; //返回空
19 }
20 void CycQueueFree(CycQueue *q) //释放队列
21 {
22     if (q!=NULL)
23         free(q);
24 }
25 int CycQueueIsEmpty(CycQueue *q)  //队列是否为空
26 {
27     return (q->head==q->tail);
28 }
29 int CycQueueIsFull(CycQueue *q)//队列是否已满
30 {
31     return ((q->tail+1)%QUEUEMAX==q->head);
32 }
33 int CycQueueIn(CycQueue *q,DATA data)//入队函数
34 {
35     if((q->tail+1)%QUEUEMAX == q->head )
36     {
37         printf("队列已满!\n");
38         return 0;
39     }else{
40         q->tail=(q->tail+1)%QUEUEMAX;//求列尾序号
41         q->data[q->tail]=data;
42         return 1;
43     }
44 }
45 DATA *CycQueueOut(CycQueue *q)//循环队列的出队函数
46 {
47     if(q->head==q->tail) //队列为空
48     {
49         printf("队列已空!\n");
50         return NULL;
51     }else{
52         q->head=(q->head+1)%QUEUEMAX;
53         return &(q->data[q->head]);
54     }
55 }
56 int CycQueueLen(CycQueue *q) //获取队列长度
57 {
58     int n;
59     n=q->tail-q->head;
60     if(n<0)
61         n=QUEUEMAX+n;
62     return n;
63 }
64 DATA *CycQueuePeek(CycQueue *q) //获取队定中第1个位置的数据
65 {
66     if(q->head==q->tail)
67     {
68         printf("队列已经为空!\n");
69         return NULL;
70     }else{
71         return &(q->data[(q->head+1)%QUEUEMAX]);
72     }
73 } 

2-10 BankQueue.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 typedef struct
 5 {
 6     int num; //顾客编号
 7     long time;//进入队列时间
 8 }DATA;
 9 #include "2-9 CycQueue.h"
10 int num;//顾客序号
11 void add(CycQueue *q) //新增顾客排列
12 {
13     DATA data;
14     if(!CycQueueIsFull(q)) //如果队列未满
15     {
16         data.num=++num;
17         data.time=time(NULL);
18         CycQueueIn(q,data);
19     }
20     else
21         printf("\n排队的人太多,请稍候再排队!\n");
22 }
23 void next(CycQueue *q) //通知下一顾客准备
24 {
25     DATA *data;
26     if(!CycQueueIsEmpty(q)) //若队列不为空
27     {
28         data=CycQueueOut(q); //取队列头部的数据
29         printf("\n请编号为%d的顾客办理业务!\n",data->num);
30     }
31     if(!CycQueueIsEmpty(q)) //若队列不为空
32     {
33         data=CycQueuePeek(q);//取队列中指定位置的数据
34         printf("请编号为%d的顾客准备,马上将为您理业务!\n",data->num);
35     }
36 }
37 int main()
38 {
39     CycQueue *queue1;
40     int i,n;
41     char select;
42     num=0;//顾客序号
43     queue1=CycQueueInit(); //初始化队列
44     if(queue1==NULL)
45     {
46         printf("创建队列时出错!\n");
47         getch();
48         return 0;
49     }
50     do{
51         printf("\n请选择具体操作:\n");
52         printf("1.新到顾客\n");
53         printf("2.下一个顾客\n");
54         printf("0.退出\n") ;
55         fflush(stdin);
56         select=getch();
57         switch(select)
58         {
59             case ‘1‘:
60                 add(queue1);
61                 printf("\n现在共有%d位顾客在等候!\n",CycQueueLen(queue1));
62                 break;
63             case ‘2‘:
64                 next(queue1);
65                 printf("\n现在共有%d位顾客在等候!\n",CycQueueLen(queue1));
66                 break;
67             case ‘0‘:
68                 break;
69         }
70     }while(select!=‘0‘);
71     CycQueueFree(queue1); //释放队列
72     getch();
73     return 0;
74 }
时间: 2024-10-11 03:33:04

2.2 先进先出结构:队列的相关文章

python基础一 ------顺序结构队列的python实现

队列:先进先出的线性表(FIFO),只允许在一段插入并在另一端取出 以下是python实现 1 #-*-coding:utf-8-*- 2 #顺序存储队列的python实现 3 4 class Queue(object): 5 def __init__(self,length): 6 self.queue = [] 7 self.length = length 8 9 10 def en_queue(self,e): 11 #判断队列是否假满,是则删掉先进入的,对尾插入新的元素 12 if le

队列的顺序存储结构和链式存储结构

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(在队尾进行插入操作,在对头进行删除操作). 与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表. 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础. 队列的链式存储结构 队列既可以用链表实现,也可以用顺序表实现.跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列. typedef struct QNode { ElemT

数据结构14:队列(Queue),“先进先出”的数据结构

队列是线性表的一种,在操作数据元素时,和栈一样,有自己的规则:使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列,如图1. 图1 队列示意图 称进入队列的一端为“队尾”:出队列的一端为“队头”.数据元素全部由队尾陆续进队列,由队头陆续出队列. 队列的先进先出原则 队列从一端存入数据,另一端调取数据的原则称为“先进先出”原则.(first in first out,简称“FIFO”) 图1中,根据队列的先进先出原则,(a1,a2,a3,…,an)中,由于 a1 最先从队尾进入队列

【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列

package cn.study.concurrency.ch14; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 使用condition作为挂起线程的信号 * 这个是先进先出的队列 * @author xiaof * * @param <T> */ public

Nginx 队列双向链表结构 ngx_quene_t

队列链表结构 队列双向循环链表实现文件:文件:src/core/ngx_queue.h/.c.在 Nginx 的队列实现中,实质就是具有头节点的双向循环链表,这里的双向链表中的节点是没有数据区的,只有两个指向节点的指针.需注意的是队列链表的内存分配不是直接从内存池分配的,即没有进行内存池管理,而是需要我们自己管理内存,所有我们可以指定它在内存池管理或者直接在堆里面进行管理,最好使用内存池进行管理.节点结构定义如下: /* 队列结构,其实质是具有有头节点的双向循环链表 */ typedef str

西风的数据结构教程(2)——队列

队列是一种简单的先进先出结构,各种需要排队的事情,都可以开一个队列来完成. 利用链表或数组,都能实现队列,不过最大的区别就是,数组的扩展比较困难,而链表较为容易,但链表资源消耗稍多. 数据结构的不同导致了队列的实现也不相同,链表上次已经实现过了,只需简单包装即可使用,这里,我们介绍简单的用数组模拟队列的方式: 这个队列是固定长度的一个数组构建的,另外保存两个int数字,负责记录数组的下标索引. 我们下面就来编写一下这个队列,还是使用C语言,在此,我会继续介绍C语言的基础知识. 队列实现 复习一下

浅谈数据结构系列 栈和队列

计算机程序离不开算法和数据结构,在数据结构算法应用中,栈和队列应用你比较广泛,因为两者在数据存放和读取方面效率比较高,本章节重点讲解两者的基本概念和实现. 基本概念 栈:是一种先进后出,后进先出的数据结构,本质上是线性表,只是限制仅允许在表的一段进行插入和删除工作.此端为栈顶,这是在栈中应用很关键的概念.所有数据的处理都是在栈顶进行的,进栈时,栈中元素增加,栈顶上移一位,出栈时栈顶下移一位.应用中比如:洗碗,每次洗干净的碗放在上面-进栈,取碗,从顶上取出一个-出栈:装子弹-进栈,开枪-出栈. 队

大话数据结构之三(栈和队列)

栈的定义 栈是仅限有表尾进行插入和删除操作的线性表 允许插入和删除操作的一端称为栈顶,别一端称为栈底.不包含任何数据元素的栈称为空栈.栈又称为先进后出(Last In First Out)的线性表,简称为LIFO结构. 栈的插入操作叫做进栈,也称压栈.入栈. 栈的删除操作叫做出栈,也称弹栈 栈的抽象数据类型 栈的顺序存储结构 栈的插入和删除操作和时间复杂度均是O(1) 栈的不同状态下的示意图: 栈的实现源码如下: #include "stdio.h" #include "st

Java多线程 阻塞队列和并发集合

转载:大关的博客 Java多线程 阻塞队列和并发集合 本章主要探讨在多线程程序中与集合相关的内容.在多线程程序中,如果使用普通集合往往会造成数据错误,甚至造成程序崩溃.Java为多线程专门提供了特有的线程安全的集合类,通过下面的学习,您需要掌握这些集合的特点是什么,底层实现如何.在何时使用等问题. 3.1 BlockingQueue接口 java阻塞队列应用于生产者消费者模式.消息传递.并行任务执行和相关并发设计的大多数常见使用上下文. BlockingQueue在Queue接口基础上提供了额外