队列的实现

简介:
一、顺序队列

[cpp] view plaincopy
   
typedef  int QElemType;  
   
  // c3-3.h 队列的顺序存储结构(可用于循环队列和非循环队列)  
 #define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1)  
 struct SqQueue  
 {  
   QElemType *base; // 初始化的动态分配存储空间  
   int front; // 头指针,若队列不空,指向队列头元素  
   int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置  
 };  
   
 // bo3-4.cpp 顺序队列(非循环,存储结构由c3-3.h定义)的基本操作(9个)  
 Status InitQueue(SqQueue &Q)  
 { // 构造一个空队列Q  
   Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));  
   if(!Q.base) // 存储分配失败  
     exit(OVERFLOW);  
   Q.front=Q.rear=0;  
   return OK;  
 }  
  
 Status DestroyQueue(SqQueue &Q)  
 { // 销毁队列Q,Q不再存在  
   if(Q.base)  
     free(Q.base);  
   Q.base=NULL;  
   Q.front=Q.rear=0;  
   return OK;  
 }  
  
 Status ClearQueue(SqQueue &Q)  
 { // 将Q清为空队列  
   Q.front=Q.rear=0;  
   return OK;  
 }  
  
 Status QueueEmpty(SqQueue Q)  
 { // 若队列Q为空队列,则返回TRUE,否则返回FALSE  
   if(Q.front==Q.rear) // 队列空的标志  
     return TRUE;  
   else  
     return FALSE;  
 }  
  
 int QueueLength(SqQueue Q)  
 { // 返回Q的元素个数,即队列的长度  
   return(Q.rear-Q.front);  
 }  
  
 Status GetHead(SqQueue Q,QElemType &e)  
 { // 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR  
   if(Q.front==Q.rear) // 队列空  
     return ERROR;  
   e=*(Q.base+Q.front);  
   return OK;  
 }  
  
 Status EnQueue(SqQueue &Q,QElemType e)  
 { // 插入元素e为Q的新的队尾元素  
   if(Q.rear>=MAXQSIZE)  
   { // 队列满,增加1个存储单元  
     Q.base=(QElemType *)realloc(Q.base,(Q.rear+1)*sizeof(QElemType));  
     if(!Q.base) // 增加单元失败  
       return ERROR;  
   }  
   *(Q.base+Q.rear)=e;  
   Q.rear++;  
   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+1;  
   return OK;  
 }  
  
 Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))  
 { // 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败  
   int i;  
   i=Q.front;  
   while(i!=Q.rear)  
   {  
     vi(*(Q.base+i));  
     i++;  
   }  
   printf("\n");  
   return OK;  
 }  

二、链队列

[cpp] view plaincopy
typedef int QElemType;  
  
// c3-2.h 单链队列--队列的链式存储结构  
typedef struct QNode  
{  
  QElemType data;  
  QNode *next;  
}*QueuePtr;  
  
struct LinkQueue  
{  
  QueuePtr front,rear; // 队头、队尾指针  
};  
  
  
// bo3-2.cpp 链队列(存储结构由c3-2.h定义)的基本操作(9个)  
Status InitQueue(LinkQueue &Q)  
{ // 构造一个空队列Q  
  if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))  
    exit(OVERFLOW);  
  Q.front->next=NULL;  
  return OK;  
}  
  
Status DestroyQueue(LinkQueue &Q)  
{ // 销毁队列Q(无论空否均可)  
  while(Q.front)  
  {  
    Q.rear=Q.front->next;  
    free(Q.front);  
    Q.front=Q.rear;  
  }  
  return OK;  
}  
  
Status ClearQueue(LinkQueue &Q)  
{ // 将Q清为空队列  
  QueuePtr p,q;  
  Q.rear=Q.front;  
  p=Q.front->next;  
  Q.front->next=NULL;  
  while(p)  
  {  
    q=p;  
    p=p->next;  
    free(q);  
  }  
  return OK;  
}  
  
Status QueueEmpty(LinkQueue Q)  
{ // 若Q为空队列,则返回TRUE,否则返回FALSE  
  if(Q.front==Q.rear)  
    return TRUE;  
  else  
    return FALSE;  
}  
  
int QueueLength(LinkQueue Q)  
{ // 求队列的长度  
  int i=0;  
  QueuePtr p;  
  p=Q.front;  
  while(Q.rear!=p)  
  {  
    i++;  
    p=p->next;  
  }  
  return i;  
}  
  
Status GetHead(LinkQueue Q,QElemType &e)  
{ // 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR  
  QueuePtr p;  
  if(Q.front==Q.rear)  
    return ERROR;  
  p=Q.front->next;  
  e=p->data;  
  return OK;  
}  
  
Status EnQueue(LinkQueue &Q,QElemType e)  
{ // 插入元素e为Q的新的队尾元素  
  QueuePtr p;  
  if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败  
    exit(OVERFLOW);  
  p->data=e;  
  p->next=NULL;  
  Q.rear->next=p;  
  Q.rear=p;  
  return OK;  
}  
  
Status DeQueue(LinkQueue &Q,QElemType &e)  
{ // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR  
  QueuePtr p;  
  if(Q.front==Q.rear)  
    return ERROR;  
  p=Q.front->next;  
  e=p->data;  
  Q.front->next=p->next;  
  if(Q.rear==p)  
    Q.rear=Q.front;  
  free(p);  
  return OK;  
}  
  
Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType))  
{ // 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败  
  QueuePtr p;  
  p=Q.front->next;  
  while(p)  
  {  
    vi(p->data);  
    p=p->next;  
  }  
  printf("\n");  
  return OK;  
}  
 

三、循环队列

[cpp] view plaincopy
// c3-3.h 队列的顺序存储结构(可用于循环队列和非循环队列)  
#define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1)  
struct SqQueue  
{  
  QElemType *base; // 初始化的动态分配存储空间  
  int front; // 头指针,若队列不空,指向队列头元素  
  int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置  
};  
  
// bo3-3.cpp 循环队列(存储结构由c3-3.h定义)的基本操作(9个)  
Status InitQueue(SqQueue &Q)  
{ // 构造一个空队列Q  
  Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));  
  if(!Q.base) // 存储分配失败  
    exit(OVERFLOW);  
  Q.front=Q.rear=0;  
  return OK;  
}  
  
Status DestroyQueue(SqQueue &Q)  
{ // 销毁队列Q,Q不再存在  
  if(Q.base)  
    free(Q.base);  
  Q.base=NULL;  
  Q.front=Q.rear=0;  
  return OK;  
}  
  
Status ClearQueue(SqQueue &Q)  
{ // 将Q清为空队列  
  Q.front=Q.rear=0;  
  return OK;  
}  
  
Status QueueEmpty(SqQueue Q)  
{ // 若队列Q为空队列,则返回TRUE,否则返回FALSE  
  if(Q.front==Q.rear) // 队列空的标志  
    return TRUE;  
  else  
    return FALSE;  
}  
  
int QueueLength(SqQueue Q)  
{ // 返回Q的元素个数,即队列的长度  
  return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;  
}  
  
Status GetHead(SqQueue Q,QElemType &e)  
{ // 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR  
  if(Q.front==Q.rear) // 队列空  
    return ERROR;  
  e=*(Q.base+Q.front);  
  return OK;  
}  
  
Status EnQueue(SqQueue &Q,QElemType e)  
{ // 插入元素e为Q的新的队尾元素  
  if((Q.rear+1)%MAXQSIZE==Q.front) // 队列满  
    return ERROR;  
  Q.base[Q.rear]=e;  
  Q.rear=(Q.rear+1)%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+1)%MAXQSIZE;  
  return OK;  
}  
  
Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))  
{ // 从队头到队尾依次对队列Q中每个元素调用函数vi().一旦vi失败,则操作失败  
  int i;  
  i=Q.front;  
  while(i!=Q.rear)  
  {  
    vi(*(Q.base+i));  
    i=(i+1)%MAXQSIZE;  
  }  
  printf("\n");  
  return OK;  
}  




本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3388590.html,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
存储 JSON API
aipy实战:Deepseek-V3、Hunyuan&Qwen分析618平板攻略
Aipy是一款结合LLM与Python的智能工具,用户通过简单指令即可让LLM分析并生成代码,实时解决问题。本次v0.1.28版本新增联网搜索、案例分享等功能,并引入混元和Qwen模型。测评中,三个模型完成“618平板选购攻略”任务表现各异:deepseek-v3界面精美、信息全面但价格有偏差;hunyuan-turbos-latest信息不全但界面简洁;qwen-plus-latest推荐合理但数据失真。总体而言,Aipy在操作友好性和分析界面上显著提升,适合解决实际问题。
|
10月前
|
程序员 UED Python
Python入门:3.Python的输入和输出格式化
在 Python 编程中,输入与输出是程序与用户交互的核心部分。而输出格式化更是对程序表达能力的极大增强,可以让结果以清晰、美观且易读的方式呈现给用户。本文将深入探讨 Python 的输入与输出操作,特别是如何使用格式化方法来提升代码质量和可读性。
Python入门:3.Python的输入和输出格式化
|
人工智能 开发工具 git
一看就会的智能换颜项目教程!5分钟速通明星大模型开源项目一键部署
有了通义灵码的帮助,很多明星大模型项目实操过程中遇到的问题:查找错误、解释代码、优化代码、查找文档、代码补全等等都可以用通义灵码一键解决,而且准确率很高,加上灵活的实操环境,项目跑起来会非常高效。关键是通义灵码个人版还免费!
|
搜索推荐 Linux Shell
在Linux中,如何创建一个新用户?
在Linux中,如何创建一个新用户?
【免费资料】IEEE33节点系统参数及拓扑图visio
初学者入门配电网可参考经典的IEEE 33节点系统,此系统在文献中广泛应用。资源包括节点和支路参数的Excel表格及Visio的网络拓扑图,可免费下载。配电网以闭环设计增强灵活性和可靠性,故障恢复涉及网络拓扑约束。提供的MATLAB相关链接探讨了孤岛、重构及故障恢复策略。
|
网络安全
ssh: Could not resolve hostname centos02: Temporary failure in name resolution
ssh: Could not resolve hostname centos02: Temporary failure in name resolution
1219 0
|
Java 数据格式
Javaweb之SpringBootWeb案例之yml配置文件的详细解析
Javaweb之SpringBootWeb案例之yml配置文件的详细解析
364 0
|
数据安全/隐私保护
VI操作--跳到最后一行和跳到最后一行的最后一个字符
vi操作 1.跳到文本的最后一行:按“G”,即“shift+g” 2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。 3.跳到第一行的第一个字符:先按两次“g”, 4.跳转到当前行的第一个字符:在当前行按“0”。
6117 0
|
存储 关系型数据库 MySQL
【MySQL进阶-01】深入理解mysql索引本质
【MySQL进阶-01】深入理解mysql索引本质
219 0