数据结构-循环队列的基本实现
为了解决队列满,rear不能等于front的情况,这里使用flag标记上一次操作是入队还是出队。
个人思路:判断rear上一个数据结点是否为空&rear==front来区分队列空还是满,但是循环队列只是在逻辑上实现队列,数组数据存在残留,实现麻烦,就不做了
InitSqQueue(SqQueue& Q)
Empty(SqQueue Q)
EnQueue(SqQueue &Q)
DeQueue(SqQueue& Q)
GetHead(SqQueue Q)
时间复杂度都是O(1)
#include <iostream>
using namespace std;
#define ElemType int
#define MaxSize 3
typedef struct{
ElemType data[MaxSize];
int front, rear;
bool flag; //标记上一次操作是入队(true),还是出队(false),解决队列满rear不能等于front的问题
}SqQueue;
//初始化,时间复杂度O(1)
bool InitSqQueue(SqQueue& Q) {
Q.front = Q.rear = 0;
Q.flag = false; //初始化为false
return true;
}
//判断队列是否为空,时间复杂度O(1)
bool Empty(SqQueue Q) {
if ((Q.flag == false) && (Q.front == Q.rear)) {//上一次操作是出队并且front == rear,才可以说明队列空
printf("队列空\n");
return true;
}
return false;
}
//入队,时间复杂度O(1)
bool EnQueue(SqQueue &Q) {
ElemType e;
if ((Q.flag == true) && (Q.front == Q.rear)) {//上一次操作是入队并且front == rear,才可以说明队列满
printf("队列满\n");
return false;
}
printf("请输入入队元素:");
scanf("%d", &e);
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize; //使得rear在[0,MaxSize-1]区间循环
Q.flag = true; //标记上一次操作是入队
return true;
}
//出队,时间复杂度O(1)
bool DeQueue(SqQueue& Q) {
if (Empty(Q)) {
return false;
}
printf("出队元素为:%d\n", Q.data[Q.front]);
Q.front = (Q.front + 1) % MaxSize; //使得front在[0,MaxSize-1]区间循环
Q.flag = false; //标记上一次操作是入队
return true;
}
//获取队头元素,时间复杂度O(1)
bool GetHead(SqQueue Q) {
if (Empty(Q)) {
return false;
}
printf("队列头元素为:%d\n", Q.data[Q.front]);
return true;
}
void menu()
{
printf("********1.入队 2.出队*********\n");
printf("********3.取队头 4.退出*********\n");
}
int main()
{
SqQueue Q; int choice;
InitSqQueue(Q);
while (true)
{
menu();
printf("请输入菜单序号:");
scanf("%d", &choice);
switch (choice)
{
case 1:EnQueue(Q); break;
case 2:DeQueue(Q); break;
case 3:GetHead(Q); break;
case 4:return 0;
default:printf("输入错误!!!\n");
}
}
}