考研复习之队列

循环队列

队列为满的条件

队列为满的条件需要特殊处理,因为当队列满时,队尾指针的下一个位置应该是队头指针。但是,我们不能直接比较 rear + 1 和 front 是否相等,因为 rear + 1 可能会超出数组索引的范围。因此,我们需要使用模运算 % 来确保索引在数组范围内循环。

浪费一个空间:

在这种方法中,我们故意让队列中始终保持一个空闲位置,这样当 rear 的下一个位置是 front 时,队列就是满的。

复制代码
(Q.rear + 1) % MAX_SIZE == Q.front

入队 出队

复制代码
#include<iostream>
#define Maxsize 6
using namespace std;

typedef struct {
    int data[Maxsize]; // 数组,存储Maxsize-1个元素
    int front, rear;   // 队列头和队列尾
} SqQueue;

void init(SqQueue &Q) {
    Q.front = Q.rear = 0;
}

bool enqueue(SqQueue &Q, int x) {
    if ((Q.rear + 1) % Maxsize == Q.front) // 判断循环队列是否满了
        return false;
    else {
        Q.data[Q.rear] = x; // 放入元素
        Q.rear = (Q.rear + 1) % Maxsize; // 改变队尾标记
        return true;
    }
}

bool dequeue(SqQueue &Q, int &data) {
    if (Q.rear == Q.front) // 判断队列是否为空
        return false;
    else {
        data = Q.data[Q.front]; // 取出队头元素
        Q.front = (Q.front + 1) % Maxsize; // 改变队头标记
        return true;
    }
}

bool isEmpty(SqQueue Q) {
    return Q.rear == Q.front;
}



int main() {
    SqQueue Q;
    bool ret;
    int data;
    init(Q); // 初始化队列

    ret = isEmpty(Q);
    if (ret) {
        cout << "kong" << endl;
    } else {
        cout << "bu wei kong " << endl;
    }

    ret = dequeue(Q, data);
    if (ret) {
        cout << "出队的元素是" << data << endl;
    } else {
        cout << "kong zhan" << endl;
    }

    // 测试入队和出队
    enqueue(Q, 1);
    enqueue(Q, 2);
    enqueue(Q, 3);
    enqueue(Q, 4);
    enqueue(Q, 5);

   
    while (dequeue(Q, data)) {
        cout << "出队的元素是" << data << endl;
    }

    return 0;
}

链队列

用链表表示队列

复制代码
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct node {
	int data;
	struct node *next;
}LinkNode; 

typedef struct {
	LinkNode * front ,* rear;//链表头,链表尾,即对头和队尾 
}LinkQueue;

//用带头结点的链表来实现队列 
void init(LinkQueue &Q)
{
	Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode)); 
	Q.front->next=NULL;
}


void enqueue(LinkQueue &Q,int x)
{
	LinkNode *newnode;
	newnode=(LinkNode *)malloc(sizeof(LinkNode));
	newnode->data=x;
	Q.rear->next=newnode;
	Q.rear=newnode;//rear指向新的尾部 
	newnode->next=NULL;
	
}

int dequeue(LinkQueue &Q,int &data)
{
	if(Q.rear==Q.front )
	{
		cout<<"栈空"<<endl;
	}
	else
	{
		LinkNode * q=Q.front->next;//指向第一个元素 
		Q.front->next=q->next;
		data=q->data; //获取出队的元素值 
		if(Q.rear=q)//队列只剩一个元素,被删除后要改变rear; 
		{
			Q.front=Q.rear;
		}
	}
	return data;
}
bool IsEmpty(LinkQueue Q)
{
	if(Q.front==Q.rear )
	{
		return true;
	}
	else
	{
		return false;
	}
}
int main()
{
	LinkQueue Q;
	init(Q); 
	enqueue(Q,1);
	enqueue(Q,2);
	enqueue(Q,3);
	enqueue(Q,4);
	enqueue(Q,5);
	int data;
	data=dequeue(Q,data);
	cout<<"出对的元素值是"<<data<<" "<<endl;
	return 0;
	
}
相关推荐
酉鬼女又兒1 天前
零基础入门计算机组成原理:控制器章节全考点汇总 | 寄存器 + 控制存储器 + 微指令
考研·职场和发展·计算机外设
如君愿1 天前
考研复习 Day 39 | 密码学--第四章 分组密码(上)
考研·密码学
daanpdf3 天前
考研英语一历年真题及答案解析PDF(2010-2026)百度网盘
考研·pdf
05候补工程师3 天前
【408狂飙·数据结构】核心考点深度复盘:数组地址计算、特殊矩阵压缩存储与树的五大性质解题直觉
数据结构·笔记·线性代数·考研·算法·矩阵
daanpdf3 天前
历年考研数学一、数学二、数学三真题试卷及答案PDF
考研·pdf
如君愿3 天前
考研复习 Day 38 | 密码学--第三章 古典密码
考研·密码学·课后习题
蒟蒻的贤4 天前
编译原理里的冲突到底是什么?
考研·算法
荒原之梦网4 天前
在不确定的命题环境中,如何建立稳定的考研数学备考体系
考研·考研数学·荒原之梦考研数学
05候补工程师4 天前
【线性代数】硬核复习笔记:核心定理推导、矩阵变换本质与自创高频题解
经验分享·笔记·线性代数·考研·矩阵
如君愿4 天前
考研复习 Day 37 | 密码学--第一章 绪论、第二章 相关的基础知识
考研·密码学