顺式队列(循环队列)8种操作的实现

时间:2022-06-12 20:27:22
顺式队列(循环队列)8种操作的实现顺式队列(循环队列)8种操作的实现顺式队列(循环队列)8种操作的实现顺式队列(循环队列)8种操作的实现

   

操作

时间复杂度(T(n))

空间复杂度(S(n))

求长度

O(1)

O(1)

判断是否为空

O(1)

O(1)

得到队首元素

O(1)

O(1)

插入元素

O(1)

O(1)

删除元素

O(1)

O(1)

清空队列

O(1)

O(1)

判断是否已满

O(1)

O(1)

/*  数据结构分析与学习专栏
*  Copyright (c) 2015, 山东大学计算机科学与技术专业学生
*  All rights reserved.
*   作    者:   高祥
*   完成日期:  2015 年 4 月 6 日
*   版 本 号:013
 
*任务描述:针对链式队列,实现8个基本操作
*   1:建立队列 ;
*   2:输出队列 ;
*   3:求队列的长度 ;
*   4:判断队列是否为空 ;
*   5:得到队列的队首元素;
*   6:向队列中插入元素(插在队尾) ;
*   7:删除队列的元素(删除队首元素);
*   8: 清空队列;
 
*主要函数:
*  1. InitQueue(Queue &Q);//初始化队列
*  2. CreateQueue(Queue &Q);//创建队列
*  3. Output(Queue Q);//输出队列元素
*  4. int QueueLength(Queue Q);//求队列的长度
*  5. IsEmpty(Queue Q);//判断队列是否为空
*  6. IsFull(Queue Q);//判断队列是否已满
*  7. GetHead(Queue Q);//得到队列首元素
*  8. EnQueue(Queue &Q,ElemType elem);//插入元素
*   9.DeQueue(Queue &Q);//删除元素
*  10. ClearQueue(Queue &Q);//清空队列
 
*/
#include<iostream>
#include<cstdlib>
using namespace std;
 
#define OK 1
#define FALSE 0
#define MAXSIZE 10
 
typedef int ElemType;
typedef int Status;
 
typedef struct
{
   ElemType *base;//存储元素空间的指针
   int first;//头指针:始终指向非空队列的首元素位置
   int last;//尾指针:始终指向非空队列的最后一个元素的下一个位置
} Queue;
 
Status InitQueue(Queue &Q);//初始化队列
void CreateQueue(Queue &Q);//创建队列
void Output(Queue Q);//输出队列元素
int QueueLength(Queue Q);//求队列的长度
Status IsEmpty(Queue Q);//判断队列是否为空
Status IsFull(Queue Q);//判断队列是否已满
void GetHead(Queue Q);//得到队列首元素
Status EnQueue(Queue &Q,ElemTypeelem);//插入元素
void DeQueue(Queue &Q);//删除元素
void ClearQueue(Queue &Q);//清空队列
void Interaction();
 
int main()
{
   Queue Q;
   Interaction();
 
   int operate;
   while(cin>>operate)
    {
       switch(operate)
       {
       case 0:
           return 0;
 
       case 1:
           CreateQueue(Q);
           break;
 
       case 2:
           Output(Q);
           break;
 
       case 3:
           cout<<"队列的长度为:"<<QueueLength(Q)<<endl;
           break;
 
       case 4:
           if(IsEmpty(Q))
           {
                cout<<"队列为空。\n";
           }
           else
           {
                cout<<"队列不为空。\n";
           }
            break;
 
       case 5:
           GetHead(Q);
           break;
 
       case 6:
           cout<<"请输入要插入的元素:";
           ElemType elem;
           cin>>elem;
           if(EnQueue(Q,elem))
           {
                cout<<"新队列为:";
                Output(Q);
           }
           break;
 
       case 7:
           DeQueue(Q);
           break;
 
       case 8:
           ClearQueue(Q);
           break;
 
       default:
           cout<<"请输入正确的操作数字!\n";
           break;
        }
    }
 
   return 0;
}
 
Status InitQueue(Queue &Q)//初始化队列
{
   Q.base=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));
   //分配MAXSIZE个存储元素的空间,实际用于存储的有MAXSIZE-1个空间,
   //少用的一个空间用于表示”队列头指针在队列尾指针的下一位置(环状上)“时队列为满
   if(!Q.base)
    {
       cout<<"内存非配失败。\n";
       return FALSE;
    }
 
    Q.first=Q.last=0;//初始化队列为空
   return OK;
}
 
void CreateQueue(Queue &Q)//创建队列
{
   if(InitQueue(Q))
    {
INPUT:
       cout<<"请输入队列元素的个数:";
       int queuesize;
       cin>>queuesize;
 
       if(queuesize>MAXSIZE-1)
       {
           cout<<"超出最大容量,请重新输入。\n";
           goto INPUT;
       }
 
       cout<<"请输入"<<queuesize<<"个元素:";
       while(queuesize--)
       {
           ElemType elem;
           cin>>elem;
           EnQueue(Q,elem);//借用插入元素函数
       }
 
       cout<<"创建的队列为:";
       Output(Q);
    }
}
 
void Output(Queue Q)//输出队列元素
{
   if(!IsEmpty(Q))
    {
       int cur=Q.first;
 
       while(cur!=Q.last)
       {
           cout<<Q.base[cur]<<" ";
           cur=(cur+1)%MAXSIZE;//注意细节
       }
       cout<<endl;
       return;
    }
   cout<<"队列为空,无法输出。\n";
}
 
int QueueLength(Queue Q)//求队列的长度
{
    //分情况讨论:
   if(Q.last>=Q.first)
    {
       return Q.last-Q.first;
    }
 
    return Q.last+MAXSIZE-Q.first;
   //首先此时(Q.last<Q.first)下标0必定在两个下标之间;
   //Q.last:表示从下标0开始至队列结束的元素个数;
   //MAXSIZE-Q.first:表示队列开始至下标0之前的元素个数
}
 
Status IsEmpty(Queue Q)//判断队列是否为空
{
   if(Q.first==Q.last)//头尾指针相等时
    {
       return OK;
    }
   return FALSE;
}
 
Status IsFull(Queue Q)//判断队列是否已满
{
   if((Q.last+1)%MAXSIZE==Q.first)//队列头指针在队列尾指针的下一位置(环状上)
    {
       return OK;
    }
   return FALSE;
}
 
void GetHead(Queue Q)//得到队列首元素
{
   if(!IsEmpty(Q))
    {
       cout<<"队首元素是:"<<Q.base[Q.first]<<endl;
       return;
    }
   cout<<"队列为空。\n";
}
 
Status EnQueue(Queue &Q,ElemTypeelem)//插入元素
{
   if(!IsFull(Q))//队列未满时
    {
       Q.base[Q.last]=elem;
       Q.last=(Q.last+1)%MAXSIZE;
       return OK;
    }
 
   cout<<"队列已满,无法插入元素。\n";
   return FALSE;
}
 
void DeQueue(Queue &Q)//删除元素
{
   if(!IsEmpty(Q))
    {
       Q.first=(Q.first+1)%MAXSIZE;
       cout<<"删除元素后的队列为:";
       Output(Q);
       return;
    }
   cout<<"队列为空,无法删除元素。\n";
}
 
void ClearQueue(Queue &Q)//清空队列
{
   Q.first=Q.last;
   cout<<"队列清空成功。\n";
}
 
void Interaction()
{
   cout<<"请输入对应操作的序号:\n";
   cout<<"0:退出程序;\n";
   cout<<"1:建立队列;\n";
   cout<<"2:输出队列;\n";
   cout<<"3:求队列的长度;\n";
   cout<<"4:判断队列是否为空;\n";
   cout<<"5:得到队列的队首元素;\n";
   cout<<"6:向队列中插入元素(插在队尾);\n";
   cout<<"7:删除队列的元素(删除队首元素);\n";
   cout<<"8:清空队列;\n";
   cout<<"该队列最大容量为:"<<MAXSIZE-1<<"个元素。\n";
}