一.简述

  空队列的处理方法: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编译执行结果

  

    

最新文章

  1. java SE编写图形应用程序
  2. 利用scp 远程上传下载文件/文件夹和ssh远程执行命令
  3. C#之Windows消息处理
  4. Android直方图递增View
  5. centOS6.6升级gcc4.8
  6. OpenStack实战(一)
  7. Oracle 经典语法(一)
  8. Unix/Linux中shell调用sqlplus的方式
  9. Redis缓存 ava-Jedis操作Redis,基本操作以及 实现对象保存
  10. MATLAB LU函数
  11. java 正则表达式例子, 查找字符串
  12. While reading XXX pngcrush caught libpng error: N
  13. mbed 初试(LinkNode 板卡)(2016-04-21)
  14. python3 爬 妹子图
  15. 历届试题 小数第n位 (求循环节)
  16. java小tip
  17. linux编写脚本检测本机链接指定IP段是否畅通
  18. cs 更新
  19. Python 算法(2) 哈夫曼编码 Huffman Encoding
  20. gc摘要

热门文章

  1. 阿里云安装LNMP以及更改网站文件和MySQL数据目录
  2. who命令的总结
  3. 更好的逐帧动画函数 — requestAnimationFrame 简介
  4. WPF 3D模型 3D场景
  5. HBase配置项详解
  6. 开源免费的HTML5游戏引擎——青瓷引擎(QICI Engine) 1.0正式版发布了!
  7. 领导让我重新做一个微信H5页面!
  8. 2016 5.03开始记录我的it学习。
  9. team foundation server——网络代码管理工具
  10. iOS-- pod常用命令