前两天出去找女朋友玩了,过两天又可以去旅游了,回来还是要好好学习呀!新的结构又要出现了。我心里有点害怕,但是!
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
假设一个队列里面有元素1、2、3、4、5,其具体情况如图所示:
当我们需要入队的时候,其元素处于队尾方向。
从队尾入队,其入队结果如图所示。
当我们需要出队的时候,其元素从队头出队。其入队示意图如图所示。
对队列进行操作前要定义队列的结构体。
struct Node{
Ele data;
struct Node* Next; //data用于存储信息,Next用于存储下一个结点的地址。
};
typedef struct Node* LinkedList;
struct Queue{
LinkedList head;
LinkedList tail; //head为队头,tail为队尾。
};
typedef struct Queue QueueList;
Node结构体定义的是队列的每一个结点的结构体,其中有两个元素,分别是data和Next,data用于存储信息,Next用于存储队列下一个结点的地址。
Queue结构体中分别存储了每一个队列的队头与队尾,其中有两个元素,分别是head和tail,head为队头,tail为队尾。
初始化的过程可以分为两步,分别为:
1、申请空间
2、队头与队尾同时指向该空间
void init(QueueList* q){
q->head = q->tail = (LinkedList)malloc(sizeof(struct Node));
if (q->head == NULL){
printf("内存空间分配失败");
exit(1);
}
q->head->Next = NULL;
}
如何进行入队呢?从入队函数出发,入队函数需要输入一个队列和一个入队的元素。
void push(QueueList* q,Ele e);
元素入队的过程也可以分为三步,分别为:
动态申请空间
将元素压入队列
将队尾指针指向新节点
void push(QueueList* q,Ele e){
LinkedList p;
p = (LinkedList)malloc(sizeof(struct Node));
if (p == NULL){
printf("内存空间分配失败");
exit(1);
}
p->Next = NULL;
p->data = e;
q->tail->Next = p; //将元素压入队列、将队尾指针指向新节点
q->tail = p;
}
如何进行出队呢?从出队函数出发,出队函数需要输入一个队列和一个接收信息的元素。
void pop(QueueList* q, Ele* e);
元素出队的过程也可以分为三步,分别为:
判断队列是否空,是则报错
通过中间节点取出队头
释放中间节点
void pop(QueueList* q, Ele* e){
LinkedList p;
if (q->head == q->tail){
printf("队列已空");
exit(1);
}
p = q->head->Next;
q->head->Next = p->Next; //利用p取出队头
*e = p->data; //信息存入元素e
if (q->tail == p){
q->tail = q->head; //判断是否取出所有元素,如果取出所有元素,队头指向队尾
}
free(p); //释放中间节点
}
#include
#include
typedef int Ele;
struct Node{
Ele data;
struct Node* Next; //data用于存储信息,Next用于存储下一个队列下一个元素的地址。
};
typedef struct Node* LinkedList;
struct Queue{
LinkedList head;
LinkedList tail; //head为队头,tail为队尾。
};
typedef struct Queue QueueList;
void init(QueueList* q){
q->head = q->tail = (LinkedList)malloc(sizeof(struct Node));
if (q->head == NULL){
printf("内存空间分配失败");
exit(1);
}
q->head->Next = NULL;
}
void push(QueueList* q,Ele e){
LinkedList p;
p = (LinkedList)malloc(sizeof(struct Node));
if (p == NULL){
printf("内存空间分配失败");
exit(1);
}
p->Next = NULL;
p->data = e;
q->tail->Next = p; //将元素压入队列、将队尾指针指向新节点
q->tail = p;
}
void pop(QueueList* q, Ele* e){
LinkedList p;
if (q->head == q->tail){
printf("队列已空");
exit(1);
}
p = q->head->Next;
q->head->Next = p->Next; //利用p取出队头
*e = p->data; //信息存入元素e
if (q->tail == p){
q->tail = q->head; //判断是否取出所有元素,如果取出所有元素,队头指向队尾
}
free(p); //释放中间节点
}
void release(QueueList* q){
LinkedList p;
p = q->head;
while (p){
q->head = q->head->Next;
free(p);
p = q->head;
}
}
int main(){
QueueList q;
int num,i;
Ele e;
init(&q);
printf("请输入你要输入几个数字:");
scanf("%d", &num);
for (i = 0; i < num; i++){
scanf("%d", &e);
push(&q, e);
}
for (i = 0; i < num; i++){
pop(&q, &e);
printf("%d\n", e);
}
return 0;
}
https://github.com/bubbliiiing/Data-Structure-and-Algorithm
希望得到朋友们的喜欢。
有问题的朋友可以提问噢。