队列很重要的一点就是入队在队尾进行,出队在队首进行,所以又把队列称为先进先出表。
功能实现
1.入队功能
使用链表实现
#include"iostream"
using namespace std;
typedef struct student{
int data;
student* next;
}Node;
typedef struct linkQueue{
Node *first, *rear;
linkQueue() :first(NULL), rear(NULL){}
}Queue;
/*
入队,入队是在队尾操作,出队是在队首操作
*/
Queue* insert(Queue *Q, int x){
Node *temp;
temp = (Node*)malloc(sizeof(Node));
temp->data = x;
temp->next = NULL;
if (Q->rear == NULL){
Q->first = temp;
Q->rear = temp;
}
else{
Q->rear->next = temp;
Q->rear = temp;
}
return Q;
}
int main(){
Queue *q = new Queue;
insert(q, 1);
insert(q, 2);
insert(q, 3);
cout << "队首:"<<q->first->data << endl;
cout << "队尾:" << q->rear->data << endl;
system("pause");
return 0;
}
现象如下图所示:
2.出队功能
出队在队首操作,分三种情况:
1.队首为空,直接返回空;
2.队首与队尾相同,出队后,队首和队尾为空;
3.其他,删除原队首,将队首指向原队首的下一个节点。
/*
出队
*/
Queue* dequeue(Queue* Q){
Node *temp;
if (Q->first == NULL){
cout << "NULL Queue" << endl;
return NULL;
}
else{
temp = Q->first;
if (Q->first == Q->rear){
Q->first = NULL;
Q->rear = NULL;
}
else{
Q->first = Q->first->next;
free(temp);
}
return Q;
}
}
int main(){
Queue *q = new Queue;
//入队
cout << "入队:" << endl;
enqueue(q, 1);
enqueue(q, 2);
enqueue(q, 3);
cout << "队首:"<<q->first->data << endl;
cout << "队尾:" << q->rear->data << endl;
//出队
cout << "出队" << endl;
dequeue(q);
cout << "队首:" << q->first->data << endl;
cout << "队尾:" << q->rear->data << endl;
system("pause");
return 0;
}
现象如下图所示: