12队列的实现.ppt
文本预览下载声明
3.4 队列
3.4.1 队列的定义及特点
队列是一种只允许在表的一端进行插入,在另一端进行删除操作的线性表,因此具有先进先出的特性。队列中允许进行插入的一端称为队尾,允许删除的另一端称为队头,当队列中没有元素时称为空队。
队列的基本操作有:
1、构造一个空的队列
2、在队尾部插入元素
3、在队头删除元素
4、得到队头元素
5、判断队列是否为空;3.4.2 链队列---队列的链式表示和实现
采用单链表的形式,为了操作方便,使用头结点,使用队头指针front、队尾指针tail。
front指向链表的第一个元素,rear指向链表的最后一个元素。
具体实现如下:
#include stdafx.h
#includeiostream
using namespace std;
typedef int ElemType ;
typedef struct QNode
{
ElemType data;//数据域
QNode *next;//指针域
}QNode,*QueuePtr;//链式队列的结点
typedef struct
{
QueuePtr front;//指向队头的指针
QueuePtr rear;//指向队尾元素的指针
}LinkQueue;;void InitQueue(LinkQueue Q)
{
Q.front=Q.rear=new QNode;//队列设立头结点以便于操作
(Q.front)-next=0;
}
/////
int EnQueue(LinkQueue Q,ElemType e)
{//数据元素e入队
QNode *p=new QNode;//生成新结点
if(p==0)return 0;
p-data=e;
p-next=0;
Q.rear-next=p;//将新结点插入到尾部
Q.rear=p;
return 1;
};int DeQueue(LinkQueue Q,ElemType e)
{//从队头删除元素
if(Q.front==Q.rear )return 0;//若队列为空则不能删除
QNode *p=Q.front-next;
Q.front-next=p-next;
e=p-data;
if(p==Q.rear)Q.rear=Q.front;//当队列中只有一个元素时,要特别注意尾指针的指向
delete p;
return 1;
};int GetTop(LinkQueue Q,ElemType e)
{//得到对头元素的值
if(Q.front==Q.rear )return 0;
e=Q.front-next-data;
return 1;
}
///////
bool Empty(LinkQueue Q)
{//判断队列是否为空
if(Q.front==Q.rear )return true;
return false;
}
////////;void print(LinkQueue Q)
{
cout打印链队列endl;
QNode *p=Q.front-next;
while(p!=0)
{
coutp-data ;
p=p-next;
}
coutendl;
};int main(int argc, char* argv[])
{
int b[7]={2,6,8,9,11,15,20};
LinkQueue Q;
InitQueue(Q);
for(int i=0;i7;i++)
EnQueue(Q,b[i]);
print(Q);
while(!Empty(Q))
{
int e;
GetTop(Q,e);
couteendl;
DeQueue(Q,e);
//print(Q);
}
coutendl;
return 0;
};3.4.3 循环队列
这种方法是基于连续空间的。;循环队列演示;J1;J1;J3;J3;J5;用front指向队头元素,rear指向队尾元素的下一个位置,用length指示队列中有多少元素,用MAXSIZE指示线性空间总的长度。
向队列尾部插入元素时,rear=(rear+1)% MAXSIZE;length++;
从队列头部删除元素时, front=(front+1)%MAXSIZE;length--;
当length== MAXSIZE时,队列满。 ;具体实现如下:
#include stdafx.h
#include iostream
using namespace std;
typedef int QElemType;
typedef struct
{
QElemType *base;//顺序队列所占空间的首地址
显示全部