3.2-3 队列的实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

堆栈和队列

Content

堆栈1

队列2

表达式计算3

递归4

PART TWO

队列

•队列的基本概念

•队列的ADT

•队列的顺序表示和循环队列

•循环队列的实现

•链式队列的实现

void Create(Queue *Q,int mSize){Q->maxSize=mSize;Q->element=(ElemType*)malloc(sizeof(ElemType)*mSize);Q->front=Q->rear=0;}

typedef struct queue{

int front;

int rear;

int maxSize;

ElemType *element;

} Queue;•创建一个能容纳mSize 个单元的空队列

void Destroy(Queue *Q){free(Q->element);Q->maxSize=-1;Q->front=Q->rear=-1;}typedef struct queue{

int front;

int rear;

int maxSize;

ElemType *element;

} Queue;•销毁一个已存在的队列,即释放队列占用的数组空间

void Clear(Queue *Q){Q->front=Q->rear=0;}

•清除队列中全部元素,但并不释放空间。

BOOL IsEmpty(Queue *Q){return Q->front==Q->rear;}typedef struct queue{

int front;

int rear;

int maxSize;

ElemType *element;} Queue;BOOL IsFull(Queue *Q){

return (Q->rear+1)%Q->maxSize==Q->front;}

•判断堆栈是否已满,若是,则返回TRUE;否则返回FALSE 。•判断队列是否为空,若是,则返回TRUE;否则返回FALSE 。

BOOL Front(Queue *Q,ElemType *x){if(IsEmpty(Q))//空队列处理return FALSE;*x=Q->element[(Q->front+1)%Q->maxSize];

return TRUE;

}

•获取队头元素,并通过x 返回。若操作成功,则返回TRUE; 否则返回FALSE typedef struct queue{

int front;

int rear;

int maxSize;

ElemType *element;

} Queue;

BOOL EnQueue(Queue *Q,ElemType x){if(IsFull(Q))//溢出处理return FALSE;Q->rear=(Q->rear+1)%Q->maxSize;Q->element[Q->rear]=x;

return TRUE;

}

typedef struct queue{

int front;

int rear;

int maxSize;

ElemType *element;

} Queue;•

在队列Q 的队尾插入元素x (入队操作),操作成功返回TRUE ;否则返回FALSE 。

BOOL DeQueue(Queue *Q){if(IsEmpty(Q))//空队列处理return FALSE;Q->front=(Q->front+1)%Q->maxSize;return TRUE;}

typedef struct queue{

int front;

int rear;

int maxSize;

ElemType *element;

} Queue;•

从队列Q 中删除队头元素(出队操作)。操作成功返回TRUE ;否则返回FALSE 。

链式队列

•队列也可以用链接方式表示,队头指针front 和队尾指针rear 分别指向队头结点和队尾结点。

•链接方式表示的队列又称链式队列,其实现方法类似于

单链表。

typedef struct queue{Node *front ;Node *rear;} Queue; typedef struct node{

ElemType element;

struct node *link;

} Node;

链式队列

//进队操作

void EnQueue(Queue *Q, ElemType x)

{

Node* p= (Node*)malloc(sizeof(Node));

p->element = x;

p->link = NULL;

Q->rear->link=p;

Q->rear=p;

}//出队操作

void DeQueue(Queue *Q)

{ //若队列为空,直接返回

if(Q->front ==NULL)

return;

Node *p=Q->front;

Q->front=p->link;

free(p);

//若出队后,队列为空,则需重置rear

if(Q->front ==NULL)

Q->rear=NULL;

}

相关文档
最新文档