一.顺序队
1.入队判断队满,出队判断队空;
2.顺序队定义时,要注意front、rear是下标,不是指针。
typedef struct{
int data[maxsize];
int rear,front; // front:队头元素的下标。rear:队尾元素的后一个位置的下标(下一个待插入的位置),
}sqListQueue;
3,如果判断队满的条件是Q.front = (Q.rear+1)%maxsize,那么就要占用maxsize中一个位置来存放Q.rear指向,为了避免空间浪费就引入了tag、size判断队满
4.---使用tag时,初始化时tag=0,只有入队时将tag改为1,出队时tag改为0。判断队满:Q.rear==Q.front && Q.tag==1;队空:Q.rear == Q.front && Q.tag==0。
5..---使用size时,初始化时size=0,入队时size++,出队时size--。判断队满:Q.size == maxsize;队空:Q.size==0。
二.链队
1.出队判断队空;出队还需要判断当前结点是否是最后一个结点,如果是,需要把Q.rear指向Q.front
bool outQueue(LinkQueue &Q,int &e){
if(isEmpty(Q)){ // 出队:判队空
return false;
}
Node *p = Q.front->next;
e = p->data;
if(Q.rear == p){ // 出队:若出队结点为最后一个结点,则需要把队尾指向队头
Q.rear = Q.front;
}
Q.front->next = p->next;
free(p);
cout << "deQueue suc, data: " << e << endl;
return true;
}
2.链队的实现需要注意:要先定义一个单链表,再定义一个队列。
// 链队:从表尾进(rear->next),从表头出(front->next)。带头结点的链队。front->L->a1->a2
typedef struct Node{
int data;
struct Node *next;
}Node; // 链队结点
typedef struct{
struct Node *front,*rear;
}LinkQueue; // 队列,结点类型为单链表结点,在单链表结点上又加了front、rear指针
3.如果是带头结点单链表,初始化时要定义一个头结点,让队头指针、队尾指针都指向这个头结点。不带头结点的单链表实现的队列初始化时直接把队头队尾指针指向NULL即可。
void initQ(LinkQueue &Q){
Q.front = Q.rear = (Node *)malloc(sizeof(Node));
Q.front->next = NULL;
}
4.
浙公网安备 33010602011771号