王道书籍上队列的基本操作和课后部分习题
一:循环队列(数组实现)
/**
* @author Dawn
* @date 2019年11月12日20:39:27
* @version 1.0
* 循环队列:关于循环队列的最大的特点就是,在每次入队和出队以及判断队列是否满了,的时候都用的是模。而不是普通的加加减减
*/
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 6
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];//存放队列的元素
int front, rear;//队列头和队列尾
}SeQueue;
//1.初始化
void InitQueue(SeQueue& Q) {
Q.rear = Q.front = 0;//标志,不是指针哦!!
}
//2.判断队列是否为空
bool IsEmpty(SeQueue Q) {
if (Q.front == Q.rear)
return true;
else
return false;
}
//3.入队
bool EnQueue(SeQueue& Q,ElemType x) {
//判断是否为满了的
if ((Q.rear + 1) % MaxSize == Q.front) {
printf("队列到此撑了
");
return false;
}
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
//4.出队
bool DeQueue(SeQueue& Q, ElemType& x) {
//如果为空
if (Q.rear == Q.front)
return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
int main() {
SeQueue Q;
InitQueue(Q);
printf("队列是否为空:%s
", IsEmpty(Q) ? "空" : "不为空");
EnQueue(Q, 1);
EnQueue(Q, 2);
EnQueue(Q, 3);
EnQueue(Q, 4);
EnQueue(Q, 5);
EnQueue(Q, 5);//会执行失败
printf("队列是否为空:%s
", IsEmpty(Q) ? "空" : "不为空");
//开始出队列
int x;
DeQueue(Q, x);
printf("出队元素为:%d
", x);//出队元素为1,先进先出
return 0;
}
二:队列的链式存储
/**
* @author Dawn
* @date 2019年11月11日22:25:13
* @version 1.0
* 队列的复习:链式存储
*/
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {//在王道书籍上这里有个小错误。没有写LinkNode,不写会报错的
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* p = (LinkNode*)malloc(sizeof(LinkNode));
p->data = x;
//插入到队列中
Q.rear->next = p;
Q.rear = p;
}
//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;
}
//王道书籍后的用2个栈(s1,s2)来实习队列
//思路?入栈:将元素放到s1中,如果s1中满了,就必须等s2栈为“空”。再将s1中的元素“全部”放入s2中
// 出栈:将s2中的元素取出,如果s2空了,则将s1中的“所有”元素放进s2中
int main() {
LinkNode L;
LinkQueue Q;
InitQueue(Q);
printf("是否队列为空:%s
", IsEmpty(Q) ? "空" : "不空");
EnQueue(Q, 1);
EnQueue(Q, 2);
EnQueue(Q, 3);
EnQueue(Q, 4);
EnQueue(Q, 5);
printf("是否队列为空:%s
", IsEmpty(Q) ? "空" : "不空");
ElemType x;
DeQueue(Q, x);
printf("出来的第一个元素为:%d
", x);
DeQueue(Q, x);
printf("出来的第二个元素为:%d
", x);
return 0;
}