数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述
空队列的处理方法:1.另设一个标志位以区别队列是空还是满;2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志。
二.头文件
//3_4_part1.h
/**
author:zhaoyu
email:zhaoyu1995.com@gmail.com
date:2016-6-9
note:realize my textbook <<数据结构(C语言版)>>
*/
//Page 64
#include <cstdio>
#include "head.h"
#define QElemType int
//----循环队列:队列的顺序存储结构----
#define MAXQSIZE 10 //最大队列长度
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
//----循环队列的基本操作说明及实现----
Status InitQueue(SqQueue &Q)
{
//构造一个空队列 Q
Q.base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if (!Q.base)
{
exit(OVERFLOW);
}
Q.front = Q.rear = ;
return OK;
}
int QueueLength(SqQueue Q)
{
//返回 Q 的元素个数,即队列的长度
return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
Status EnQueue(SqQueue &Q, QElemType e)
{
//插入元素 e 为 Q 的新的队尾元素
if ((Q.rear+)%MAXQSIZE == Q.front)
{
return ERROR;//队列满
}
Q.base[Q.rear] = e;
Q.rear = (Q.rear+)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q, QElemType &e)
{
//若队列不空,则删除 Q 的队列头元素,用 e 返回其值,
//并返回 OK,否则返回 ERROR
if (Q.front == Q.rear)
{
return ERROR;
}
e = Q.base[Q.front];
Q.front = (Q.front+)%MAXQSIZE;
return OK;
}
void PrintQueue(SqQueue Q)
{
int cnt = Q.front;
if (Q.front == Q.rear)
{
printf("void\n");
return;
}
while ((cnt+)%MAXQSIZE != Q.rear)
{
//printf("%d\t%d\n",Q.base[cnt++], cnt);输出好奇怪
printf("%d\t", Q.base[cnt]);
cnt++;
}
printf("%d\n", Q.base[cnt]);
}
3_4_part2.h
三.CPP文件
#include "3_4_part2.h"
int main(int argc, char const *argv[])
{
SqQueue Q;
InitQueue(Q);
for (int i = ; i < ; ++i)
{
EnQueue(Q, i*);
}
PrintQueue(Q);
int e;
EnQueue(Q, );
PrintQueue(Q);
DeQueue(Q, e);
printf("%d\n", e);
EnQueue(Q, );
PrintQueue(Q);
return ;
}
3_4_part2.cpp
四.测试

五.其他
在调试时发现了一点奇怪的错误,后来发现是不同编译器,对自增运算(++/--)在printf语句中作为参数何时执行的解释不同。
下面代码在VS中编译执行和用gcc编译执行的结果是不同的。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int cnt = , cnt_1 = , cnt_2 = , cnt_3 = , cnt_4 = ;
int a[] = {, , , , , , , , };
for (int i = ; i <= ; i++)
{
printf("%d-", cnt);
printf("%d\t", a[cnt++]);
}
printf("\n");
for (int i = ; i <= ; i++)
{
printf("%d-%d\t", a[cnt_1++], cnt_1);
}
printf("\n");
for (int i = ; i <= ; i++)
{
printf("%d-%d\t", a[++cnt_2], cnt_2);
}
printf("\n");
for (int i = ; i <= ; i++)
{
printf("%d-%d\t", cnt_3, a[cnt_3++]);
}
printf("\n");
for (int i = ; i <= ; i++)
{
printf("%d-%d\t", cnt_4, a[++cnt_4]);
}
printf("\n");
int cnt_5 = , cnt_6 = , cnt_7 = ;
printf("%d-%d\n", cnt_5, *(cnt_5++));
return ;
}
tese.c
VS2015编译执行结果

gcc编译执行结果

数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现的更多相关文章
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(二十七)--- 7.2图的遍历
一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...
- 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现
注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...
- C语言第十二讲,文件操作.
C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件 ...
- 数据结构算法C语言实现(十)--- 3.3栈与递归的实现
一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二. ...
- 数据结构算法[c语言]
共16章,共四部分:基础知识,数据结构,排序和搜索. 所有的实现都是使用C语言缩写.任何语言都有优缺点,选用C语言是因为它使用的广泛. 第一章: 导论 第二章: 算法分析原理 第三章: 基本数据结构 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
随机推荐
- C/C++实践笔记_002编译和链接
1.要卡死程序用异步,同步的话开一个就关一个值为非0死循环.预处理优先于编译,别称预编译main函数死循环2.程序总是从main函数开始执行的C语言本身不提供输入输出语句print等来自于stdio库 ...
- 高性能JavaScript 达夫设备
前言 在<高性能JavaScript>一书的第四章算法和流程控制中,提到了减少迭代次数加速程序的策略—达夫设备(Duff's device).达夫设备本身很好理解,但是其效果是否真的像书中 ...
- C#操作XML方法集合
一 前言 先来了解下操作XML所涉及到的几个类及之间的关系 如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家 * 1 XMLElement 主要是针对节点的一些属性进行操 ...
- SQL基础之XML
1.XML数据类型 在SQL Server中xml数据类型可以用来保存xml文档,这个文档即可以是完整的xml文档和xml片段,这样开发者就可以像使用int数据类型一样来使用xml数据类型.不过xml ...
- HoloLens开发手记 - 应用程序模型 App model
HoloLens使用Universal Windows Platform (UWP)提供的应用模型.UWP应用模型定义了应用如何被安全和完全地安装.更新.版本控制和移除.它管理了应用生命周期 - 应用 ...
- 将IList转换为List
简单点说,IList<T>直接转换为List<T>可以不用考虑.IList<T>可以用至少2种方式简单的复制成List<T>:1.IList<T ...
- Adobe Reader & PDF 护眼设置
1.首先选择“编辑”--->“首选项” 选择其他颜色,把RGB如下设置
- 路由信息协议(RIP)的防环机制
防环机制 1-记数最大值(maximum hop count):定义最大跳数(最大为15跳),当跳数为16跳时,目标为不可达. 2-水平分割(split horizon):从一个接口学习到的路由不会再 ...
- Git error on commit after merge - fatal: cannot do a partial commit during a merge
Git error on commit after merge - fatal: cannot do a partial commit during a merge this answer is : ...
- safe RGB colors
RGB是面向机器的一种颜色空间. 虽然它表示\(256 \times 256 \times 256\)种不同的颜色, 但在实际中, 大部分机器都只实现了256种颜色. 安全色(Safe RGB col ...