3.2-3 队列的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}