数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

  一.简述

  空队列的处理方法:1.另设一个标志位以区别队列是空还是满;2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志。

  二.头文件

 1 //3_4_part1.h
 2 /**
 3 author:zhaoyu
 4 email:[email protected]
 5 date:2016-6-9
 6 note:realize my textbook <<数据结构(C语言版)>>
 7 */
 8 //Page 64
 9 #include <cstdio>
10 #include "head.h"
11 #define QElemType int
12 //----循环队列:队列的顺序存储结构----
13 #define MAXQSIZE 10 //最大队列长度
14 typedef struct{
15     QElemType *base;
16     int front;
17     int rear;
18 }SqQueue;
19 //----循环队列的基本操作说明及实现----
20 Status InitQueue(SqQueue &Q)
21 {
22     //构造一个空队列 Q
23     Q.base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
24     if (!Q.base)
25     {
26         exit(OVERFLOW);
27     }
28     Q.front = Q.rear = 0;
29     return OK;
30 }
31 int QueueLength(SqQueue Q)
32 {
33     //返回 Q 的元素个数,即队列的长度
34     return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
35 }
36 Status EnQueue(SqQueue &Q, QElemType e)
37 {
38     //插入元素 e 为 Q 的新的队尾元素
39     if ((Q.rear+1)%MAXQSIZE == Q.front)
40     {
41         return ERROR;//队列满
42     }
43     Q.base[Q.rear] = e;
44     Q.rear = (Q.rear+1)%MAXQSIZE;
45     return OK;
46 }
47 Status DeQueue(SqQueue &Q, QElemType &e)
48 {
49     //若队列不空,则删除 Q 的队列头元素,用 e 返回其值,
50     //并返回 OK,否则返回 ERROR
51     if (Q.front == Q.rear)
52     {
53         return ERROR;
54     }
55     e = Q.base[Q.front];
56     Q.front = (Q.front+1)%MAXQSIZE;
57     return OK;
58 }
59 void PrintQueue(SqQueue Q)
60 {
61     int cnt = Q.front;
62     if (Q.front == Q.rear)
63     {
64         printf("void\n");
65         return;
66     }
67     while ((cnt+1)%MAXQSIZE != Q.rear)
68     {
69         //printf("%d\t%d\n",Q.base[cnt++], cnt);输出好奇怪
70         printf("%d\t", Q.base[cnt]);
71         cnt++;
72     }
73     printf("%d\n", Q.base[cnt]);
74 }

3_4_part2.h

  三.CPP文件

 1 #include "3_4_part2.h"
 2 int main(int argc, char const *argv[])
 3 {
 4     SqQueue Q;
 5     InitQueue(Q);
 6     for (int i = 1; i < 10; ++i)
 7     {
 8         EnQueue(Q, i*10);
 9     }
10     PrintQueue(Q);
11     int e;
12     EnQueue(Q, 100);
13     PrintQueue(Q);
14     DeQueue(Q, e);
15     printf("%d\n", e);
16     EnQueue(Q, 100);
17     PrintQueue(Q);
18     return 0;
19 }

3_4_part2.cpp

  四.测试

  

  五.其他

  在调试时发现了一点奇怪的错误,后来发现是不同编译器,对自增运算(++/--)在printf语句中作为参数何时执行的解释不同。

  下面代码在VS中编译执行和用gcc编译执行的结果是不同的。

 1 #include <stdio.h>
 2 int main(int argc, char const *argv[])
 3 {
 4     int cnt = 0, cnt_1 = 0, cnt_2 = 0, cnt_3 = 0, cnt_4 = 0;
 5     int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
 6     for (int i = 1; i <= 4; i++)
 7     {
 8         printf("%d-", cnt);
 9         printf("%d\t", a[cnt++]);
10     }
11     printf("\n");
12     for (int i = 1; i <= 4; i++)
13     {
14         printf("%d-%d\t", a[cnt_1++], cnt_1);
15     }
16     printf("\n");
17     for (int i = 1; i <= 4; i++)
18     {
19         printf("%d-%d\t", a[++cnt_2], cnt_2);
20     }
21     printf("\n");
22     for (int i = 1; i <= 4; i++)
23     {
24         printf("%d-%d\t", cnt_3, a[cnt_3++]);
25     }
26     printf("\n");
27     for (int i = 1; i <= 4; i++)
28     {
29         printf("%d-%d\t", cnt_4, a[++cnt_4]);
30     }
31     printf("\n");
32     int cnt_5 = 1, cnt_6 = 1, cnt_7 = 1;
33     printf("%d-%d\n", cnt_5, 5*(cnt_5++));
34     return 0;
35 }

tese.c

  VS2015编译执行结果

  

  gcc编译执行结果

  

    

时间: 2025-01-02 14:36:43

数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现的相关文章

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

一.简述 [暂无] 二.头文件 1 #ifndef _2_3_part1_H_ 2 #define _2_3_part1_H_ 3 //2_3_part1.h 4 /** 5 author:zhaoyu 6 email:[email protected] 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to mak

数据结构算法C语言实现(一)---2.3线性表的顺序表示和实现

注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习. 二.头文件 1 //head.h 2 /** 3 My Code 4 */ 5 #include

嵌入式 Linux C语言(十二)——单链表

嵌入式 Linux C语言(十二)--单链表 一.单链表简介 1.单链表的结构 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以节点来表示的,每个节点由两部分构成:一个是数据域,存储数据值,另一个是指针域,存储指向下一个节点的指针. 2.单链表的节点 单链表节点的数据结构如下: typedef struct data { unsigned int id;//学生身份ID char name[LENGTH];//学生姓名 char subject[

C语言第十二讲,文件操作.

C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件->读写文件->关闭文件. 二丶文件流的概述. 文件流称为 输入流和输出流.  其实就是从内存写数据到磁盘.和从磁盘读数据到内存. 内存->磁盘  称为输出流. 输出到磁盘 磁盘->内存 称为输入流.读取到内存. 三丶文件的打开和关闭. 1.操作原型. FILE *fopen(char

算法导论笔记——第十二~十四章 数据结构(二)树

第十二章 二叉搜索树 >=左子树的所有key,<=右子树的所有key 在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH,MINIMUM,MAXIMUM,SUCCESSOR,PREDECESSOR,INSERT和DELETE可以在O(h)时间内完成. h>=(lgn向下取整) 和快速排序算法一样,其平均性能更接近于最好情形. 随机构建二叉搜索树期望高度为O(lgn). 各种操作请自行查阅. 第十三章 红黑树 是一种(近似)平衡的二叉搜索树.可以保证在最坏情况下基本动态集合操作的时

数据结构算法C语言实现(十)--- 3.3栈与递归的实现

一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二.CPP文件 1 //3_3.cpp 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-8 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 54 9

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

数据结构算法[c语言]

共16章,共四部分:基础知识,数据结构,排序和搜索. 所有的实现都是使用C语言缩写.任何语言都有优缺点,选用C语言是因为它使用的广泛. 第一章: 导论 第二章: 算法分析原理 第三章: 基本数据结构 第四章: 抽象数据 第五章: 递归和数 第六章: 基本排序方法 第七章: 快速排序 第八章: 归并和归并排序 第九章: 优先队列和堆排序 第十章: 基数排序 第十一章: 特殊目的的排序方法 第十二章: 符号表和二叉搜索树 第十三章: 平衡树 第十四章: 哈希方法 第十五章: 基数搜索 第十六章: 外