1、队列与栈一样,都是操作受限,即都是只允许在头或尾进行操作。
2、栈与队列出入的区别
入栈是先加指针再入,入队是先入再加尾指针
出栈是先出再减指针,出队是先出再加尾指针。
3、队列的顺序存储类型
#define MaxSize 100
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
顺序队列不能用Q.rear==MaxSize做判满条件。
4、循环队列
(1)顺序队列会有假溢出的缺点,即队尾出现上溢出。
所以引入循环队列,将顺序队列从逻辑上臆想成一个环。
(2)循环队列利用除法取余运算来实现
(3)循环队列中区分队空还是队满的方法
a、牺牲一个单元
队满条件:(Q.rear+1)%MaxSizeQ.front
队空条件: Q.frontQ.rear
队中元素个数:(Q.rear-Q.front+MaxSize)%MaxSize
b、类型中增设表示元素个数的成员
队满条件:Q.SizeMaxSize
队空条件:Q.Size0;
c、增设tag数据成员
若因删除导致r.rearr.front,则为队空,若因插入导致r.rearr.front,则为队满。
5、循环队列的操作方法
注意:入队判满,出队判空,入队后队尾指针加1取模,出队后队首指针加1取模
初始化:
void InitQuene(SqQuene &Q){
Q.rear==Q.front=0;
}
判队空:
bool isEmpty(SqQuene Q){
if(Q.rear==Q.front) return 1;
else return 0;
}
入队
bool EnQueue(SqQuene &Q,ElemType x){
if((Q.rear+1)%MaxSize==Q.front) return false;
Q.data[Q.rear]==x;
Q.rear==(Q.rear+1)%MaxSize;
return true;
}
出队
bool DeQueue(SqQuene &Q,ElemType &x){
if(Q.rear==Q.front) return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
6、链式队列
链式存储类型:
typedef struct{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue
(1)初始化
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=null;
}
(2)判队空
bool IsEmpty(LinkQueue Q){
if(Q.front==Q.rear) return true;
else return false;
}
(3)入队
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=null;
Q.rear->next=s;
Q.rear=s;
}
(4)出队
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front=Q.rear) return false;
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return true;
}