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