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

来源:互联网 发布:ubuntu查看显卡信息 编辑:程序博客网 时间:2024/06/05 04:00

   

操作

时间复杂度(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";}

0 0