一步两步学算法之顺序队列

顺序链表代码  非常简单;

但这个代码会有假溢出的状况出现;

就是在队尾已满的情况下,不断出队后

若在此时进行入队操作 判断队列已满的条件是q->head==q->tail 此时这个条件满足。 但实际队列之前已经出队了好几个,前面还有空余空间,这就是假溢出;(原谅我懒得画图)

假溢出解决办法

1.每次出队后 把所有数据都往前移。这种方法要移动大量数据,效率太低。

2.使用循环队列。这种方法明天再打。

 1 #define QUEUEMAX 15
 2 typedef struct
 3 {
 4     DATA data[QUEUEMAX];        //队列数组
 5     int head;                    //队头
 6     int tail;                    //队尾
 7 }SeqQueue;
 8
 9
10
11 SeqQueue *SeqQueueInit()        //初始化队列
12 {
13     SeqQueue *q;
14     if(q=(SeqQueue*)malloc(sizeof(SeqQueue)))   //分配内存
15     {
16         q->head=0;
17         q->tail=0;
18         return q;
19     }
20     else
21         return NULL;
22 }
23
24 void SeqQueueFree(SeqQueue *q)
25 {
26     if(q!=NULL)
27         free(q);
28 }
29
30 int SeqQueueIsEmpty(SeqQueue *q)
31 {
32     return (q->head==q->tail);                 //检查队列是否为空
33 }
34
35 int SeqQueueIsFull(SeqQueue *q)
36 {
37     return (q->tail==QUEUEMAX);
38 }
39
40 int SeqQueueLen(SeqQueue *q)                //获取队列长度
41 {
42     return (q->tail-q->head);
43 }
44
45 int SeqQueueIn(SeqQueue *q,DATA data)             //入队操作
46 {
47     if(q->tail==QUEUEMAX)
48     {
49         printf("队列已满!\n");
50         return 0;
51     }
52     else
53     {
54         q->data[q->tail]=data;
55         tail++;
56         return 1;
57     }
58 }
59
60 DATA *SeqQueueOut(SeqQueue *q)            //出队操作
61 {
62     if(q->head==q->tail)
63     {
64         printf("队列为空!\n");
65         return NULL;
66     }
67     else
68     {
69         return &(q->data[q->head++]);
70     }
71 }
72
73 DATA *SeqQueuePeek(SeqQueue *q)            //获取队头元素
74 {
75     if(SeqQueueIsEmpty(q))
76     {
77         printf("队列为空!\n");
78         return NULL;
79     }
80     else
81     {
82         return &(q->data[q->head]);
83     }
84 }
时间: 2024-08-01 02:52:10

一步两步学算法之顺序队列的相关文章

一步两步学算法之哈夫曼编码(最优二叉树)

比较难理解的 都打了备注了 1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 char alphabet[]={'A','B','C','D'}; 5 typedef struct 6 { 7 int weight; //权值 8 int parent; //父节点序号 9 int left ; 10 int right; 11 }HuffmanTree; 12

一步两步学算法之树的遍历 非递归实现

递归的程序其实我觉得可读性较高  但是执行效率低下 为了做一道PAT的题 去理解了下非递归实现树的遍历 用一个栈来实现 先序遍历 先访问节点 再把节点push进栈 再访问 再push 直到next=NULL 然后pop出一个节点 也就是弹出一个节点 访问它的右边 再弹出 在访问 中序遍历 把左边节点全部push进栈 然后弹出 访问中间 再访问右边  再弹出 一直循环 后序遍历 比较难理解  要入两次栈才能访问 先左边全部入栈  栈顶是左边的元素 此书不能访问 因为右边还没入栈 下面给出先序和后序

一步两步学算法之图的广度搜索

bfs利用队列搜索    详细看代码 #define VERTEX_MAX 26 //图的最大定点数 #define MAXVALUE 32767 //最大值 #include "stdio.h" #define QUEUE_MAXSIZE 10 //队列最大容量 typedef struct { char Vertex[VERTEX_MAX]; //保存定点信息的数组 int Edges[VERTEX_MAX][VERTEX_MAX]; //边的权 int IsTrav[VERTEX

一步两步学算法之图邻接表实现

图的邻接表实现 这种结构创建邻接表时添加节点较为绕 建议断点调试下看看 邻接表和邻接矩阵相比 邻接表节省空间但是很难判断两个节点之间是否有边  此种结构要在稀疏图下才划算 下面是代码 1 #define VERTEX_MAX 20 2 #include "stdio.h" 3 #include "malloc.h" 4 typedef struct edgeNode 5 { 6 int Vertex; //顶点序号 7 int weight; 8 struct ed

一步两步学算法之最小生成树Prim算法

prim就是一个让树长大的过程  弄一个集合   从一个点开始不断向外搜索 找到权值最小的点 放进集合中  从这个集合所连的边再向外找 1 #define USED 0 2 #define NOADJ -1 3 void Prim(MaxtrixGraph G) 4 { 5 int i,j,k,min,sum=0; 6 int weight[VERTEX_MAX]; 7 char tmpvertex[VERTEX_MAX]; //临时顶点信息 8 9 for(i=1;i<G.VertexNum;

一步两步学算法之中序遍历线索二叉树

1 typedef enum 2 { 3 SubTree, //子树 4 Thread //线索 5 }NodeFlag; 6 7 typedef struct ThreadTree 8 { 9 DATA data; 10 NodeFlag lflag; 11 NodeFlag rflag; 12 struct ThreadTree *left; 13 struct ThreadTree *right; 14 }ThreadBinTree; 15 16 ThreadBinTree *Previo

一步两步学算法之二叉搜索树

Binary Search Tree  又叫二叉查找树,二叉排序树 这是种什么样的树呢? 其实就是根节点的左子树比根节点小  右子树比根节点大  同时 左子树和右子树也是二叉搜索树 代码比较简单 基本用递归实现 比较好理解  只有删除带有左右子树的节点时比较难理解 方法就是 直接在右子树找一个最小的节点 取代要被删除的节点 再继续删除右子树里的节点 详细看代码 1 #include "stdio.h" 2 #include "stdlib.h" 3 typedef

一步两步学算法之操作二叉树

操作二叉树代码比较长    二叉树基本功能在了  注释打的比较少 1 #include "stdio.h" 2 #include "stdlib.h" 3 #define QUEUE_MAXSIZE 50 4 5 typedef char DATA; 6 typedef struct ChainTree 7 { 8 DATA data; 9 struct ChainTree *left; 10 struct ChainTree *right; 11 }ChainBi

一步两步学算法之树的后序遍历 非递归实现

之前发过一篇博文  代码未测试直接发出来  被 @hoodlum1980 指出有错误 深表惭愧 参考了他的一篇关于后序遍历的文章 http://www.cnblogs.com/hoodlum1980/p/3901359.html   这是他的博文地址 又写了一遍代码  经测试通过 这个比较容易理解  给你一棵树 遍历每个节点 看它的左右儿子是否为空  若都为空或者flag都为1  则输出 flag为1的意思 就是之前已经输出了 详细看代码 1 typedef struct bintre 2 {