您的位置:首页 > 理论基础 > 数据结构算法

数据结构_4:队列:C语言

2016-01-12 21:41 323 查看
顺序队列=====假溢出

循环队列

初始化—– Q.front=Q.rear=0

队首指针进1—Q.front=(Q.front+1)%MaxSize

队尾指针进1—Q.rear=(Q.rear+1)%MaxSize

队列长度——(Q.rear+MaxSize-Q.front)%MaxSize

出队入队:指针都顺时针进1

判断队列是否是空

牺牲一个单元来区分对空和对满:入队时少用一个单元==对头指针在队尾指针的下一个位置作为对满的标志

队满: (Q.rear+1)%MaxSize==Q.front

队空:Q.front==Q.rear

队列的元素个数: (Q.rear-Q.front+MaxSize)%MaxSize

数据结构

typedef int Status;
typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */

/* 循环队列的顺序存储结构 */
typedef struct
{
QElemType data[MAXSIZE];
int front;      /* 头指针 */
int rear;       /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}SqQueue;


基本函数

/* 初始化一个空队列Q */
Status InitQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
return  OK;
}

/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear) /* 队列空的标志 */
return TRUE;
else
return FALSE;
}

/* 返回Q的元素个数,也就是队列的当前长度 */
int QueueLength(SqQueue Q)
{
return  (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
Status GetHead(SqQueue Q,QElemType *e)
{
if(Q.front==Q.rear) /* 队列空 */
return ERROR;
*e=Q.data[Q.front];
return OK;
}

/* 若队列未满,则插入元素e为Q新的队尾元素 */
Status EnQueue(SqQueue *Q,QElemType e)
{
if ((Q->rear+1)%MAXSIZE == Q->front)    /* 队列满的判断 */
return ERROR;
Q->data[Q->rear]=e;         /* 将元素e赋值给队尾 */
Q->rear=(Q->rear+1)%MAXSIZE;/* rear指针向后移一位置, */
/* 若到最后则转到数组头部 */
return  OK;
}

/* 若队列不空,则删除Q中队头元素,用e返回其值 */
Status DeQueue(SqQueue *Q,QElemType *e)
{
if (Q->front == Q->rear)            /* 队列空的判断 */
return ERROR;
*e=Q->data[Q->front];               /* 将队头元素赋值给e */
Q->front=(Q->front+1)%MAXSIZE;  /* front指针向后移一位置, */
/* 若到最后则转到数组头部 */
return  OK;
}


练习题

两个队列模拟一个栈

/article/4722593.html

q1是专职进出栈的,q2只是个中转站

入栈:直接入队列q1即可

出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中

void Push(Queue *q1, Queue *q2, int k)
{
EnQueue(q1, k);
}

int  Pop(Queue *q1, Queue *q2)
{
int tmp;
if(IsQueueEmpty(q1) == 1)
{
printf("Stack Empty!\n");
}
else
{
while(SizeOfQueue(q1) != 1)
{
EnQueue(q2, DeQueue(q1));
}
tmp = DeQueue(q1);
while(IsQueueEmpty(q2) == 0)
{
EnQueue(q1, DeQueue(q2));
}
return tmp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: