1、队列与栈的区别
栈是先进后出,而队列是先进先出。队列是特殊的线性表,仅能从队头和队尾进行操作。队头:取出数据的数据的一端,队尾:放入数据的一端。而栈仅能从栈顶进行操作。
2、常见的队列的操作
创建队列:create queue;参数指定队列可以存储的元素的最大数量,此函数只适用于动态分配数组的队列。
销毁队列:destory queue;只适用于链式和动态分配内存的队列。
3、循环队列的性质
1.头指针指向对头元素,尾指针指向队尾的下一个位置。(这里的指针都是为指针,实际是数组序号)
2.为了区分队满与对空,则定义一个存储空间为MAX_QSIZE大小的队列只允许存放MAX_QSIZE-1个数据。
3.判空条件为:if(Q.front ==Q.rear) return true;
判满条件为:if((Q.rear+1)%MAX_QSIZE==Q.front) return true;
4.循环队列的长度为:(Q.read-Q.front+MAX_SIZE)%MAX_QSIZE
5.当删除对头元素或者在对尾插入元素时指针均需向后移动。操作为:
Q.rear=(Q.rear+1)%MAX_QSIZE;
Q.front=(Q.front+1)%MAX_QSIZE.
4、如何区分空队和满队
队头指针在队尾指针的下一位置时,队满。 Q.front == (Q.rear + 1) % MAXSIZE 因为队头指针可能又重新从0位置开始,而此时队尾指针是MAXSIZE - 1,所以需要求余。
当队头和队尾指针在同一位置时,队空。 Q.front == Q.rear;
5、假溢出现象的原因
在非空队列里,队首指针始终指向队头元素,而队尾指针始终指向队尾元素的下一位置。顺序队列中存在“假溢出”现象。因为在入队和出队操作中,头、尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。因此,尽管队列中实际元素个数可能远远小于数组大小,但可能由于尾指针巳超出向量空间的上界而不能做入队操作。该现象称为假溢出。
6、队列的顺序存储结构
顺序存储结构存储的队列称为顺序队列.和顺序表一样,用一个一维数组存.对头在数组的低下标端,队尾设在高下表端.队头,队尾指针值是数组元素的下标.对头指针始终指向对头结点的前一个结点位置,初始值为0.队尾指针是指向队尾结点位置,初始值也为0。
7、队列的插入操作
SECYCLEQUEUE inCycleQueue(SECYCLEQUEUE Q,CDT x)
{
if((Q.rear+1)%CM==Q.front)
{
printf("queue is full!\n");
}
else{
Q.rear=(Q.rear+1)%CM; //2.在队尾插入,计算队尾指针的
Q.data[Q.rear]=x; //3.设置插入结点的值数值
printf("in Cycle queue Success!\n");
}
return Q;
}
8、队列的删除操作
#include "QueueCycleControl.h"
SECYCLEQUEUE outCycleQueue(SECYCLEQUEUE Q)
{ if(Q.front==Q.rear)
{
printf("Cycle queue is Empty!\n"); //1.判断循环队列是否是空
}
Else
{
front=(Q.front+1)%CM;
printf("out cycle queue success!\n");
}
return Q;
}
9、队列的链存储结构
链存储结构存储的队列称为链队列.队头指针指向链队列的头结点,头结点的指针域若为空,则为空队列;若不为空,则为指向队首结点的指针。
链队列设有一个队头指针,其值指向队列的头结点.也是唯一地标示一个链队.设置一个队尾指针方便插入结点.队头指针和队尾指针都是指针型变量。链队列没有容量的限制,所以在可用的存储空间范围内,一般不会出现上溢问题,也不存在如顺序队列的假溢出问题。
10、队列的插入操作
#include "QueueLinkControl.h"#include <stdlib.h>
LINKQUEUE * inLinkQueue(LINKQUEUE *LQ,LDT x)
{
if(LQ==NULL)
{
LQ=initLinkQueue(LQ);
}
LINKNODE *q; //1.初始化插入的结点
q=(LINKNODE *)malloc(sizeof(LINKNODE));
q->data=x;
q->next=NULL;
LQ->rear->next=q; //2.插入式从队尾插入,将插入的结点插入队尾
LQ->rear=q;
printf("in link queue success!\n");
return LQ;
}