1.队列的存储结构
#define MaxSize 50
typedef struct{
ElemType data[MaxSize]; //存放队列的元素
int front,rear; //队头尾指针
}SqQueue;
初始化操作:
Q.front=0=R.rear=0;
进队和出队操作:
1.``当队列不满时,先将值送到队尾元素,后队尾指针+1;
2.``队列不为空时,取队头元素,然后将队头指针+1;
假溢出现象:
Q.rear到顶后,Q.front不断pop后跟Q.rear指向同一个元素,但是浪费了很多空缺,且添加不了新的元素
2.循环队列
队尾指针前进 1:
Q.rear=(Q.rear+1)%MaxSize;
队首指针前进1:
Q.front=(Q.front+1)%MaxSize;
队列长度:
(Q.rear+MaxSize-Q.front)%MaxSize;
循环队列判空的条件:
Q.front=Q.rear;
重点:判断队列是否满
(Q.rear+1)%MaxSize==Q.front;
队列中元素的个数
(Q.rear-Q.front+MaxSize)%MaxSize;
2.1初始化队列
void InitQueue(SqQueue &Q){
Q.rear=Q.front=0; //初始化队首队尾指针
}
2.2判空
bool isEmpty(SqQueue Q){
//不需要对队列进行操作,所以用SqQueue Q即可而非SqQueue &Q
if(Q.rear==Q.front) return true;
return false;
}
2.3入队
bool EnQueue(SqQueue &Q,ElemType x){
//给队列Q添加元素x,Q队列会发生改变,故需要用SqQueue &Q
//1.首先判断是否为满
if((Q.rear+1)%MaxSize==Q.front) return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
return true;
}
2.4出队
bool DeQueue(SqQueue &Q,ElemType &x){
//出队:队列和元素都会发生变化,故需要用&
//1.首先判断是否为空
if(Q.rear=Q.front) return false;
//2.取出头指针指向的值x=Q.data[Q.front]
x=Q.data[Q.front];
//3.头指针前进
Q.front=(Q.front+1)%MaxSize;
return true;
}
3.链式队列
队列是一逻辑结构中的线性结构,而链式队列相等于一种存储类型(链式存储类型)
typedef struct ListQueue{
LinkNode *front,*rear; //链式队列
}*LinkQueue;
3.1为空的判断
Q