考研复习之队列

循环队列

队列为满的条件

队列为满的条件需要特殊处理,因为当队列满时,队尾指针的下一个位置应该是队头指针。但是,我们不能直接比较 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;
	
}
相关推荐
立志成为大牛的小牛8 小时前
数据结构——三十九、顺序查找(王道408)
数据结构·学习·程序人生·考研·算法
自我陶醉@13 小时前
计算机组成原理---中央处理器
考研·学习方法·408·计算机组成原理·中央处理器·指令流水线
立志成为大牛的小牛16 小时前
数据结构——四十、折半查找(王道408)
数据结构·学习·程序人生·考研·算法
蒙奇D索大1 天前
【11408学习记录】考研数学核心考点精讲:二维随机变量(离散与连续)全面解析
笔记·学习·考研·概率论·改行学it
元亓亓亓1 天前
考研408--计算机网络--day3--通信基础&信道&编码与调制
计算机网络·考研·408
蒙奇D索大2 天前
【算法】递归算法实战:汉诺塔问题详解与代码实现
c语言·考研·算法·面试·改行学it
蒙奇D索大2 天前
【11408学习记录】考研英语长难句精析:三步拆解真题复杂结构,轻松攻克阅读难关!
笔记·学习·考研·改行学it
Cathy Bryant4 天前
概率论直觉(一):大数定律
笔记·考研·数学建模
元亓亓亓5 天前
考研408--day2--组成原理--进制&定点数&符号拓展
考研·408·组成原理
立志成为大牛的小牛6 天前
数据结构——三十七、关键路径(王道408)
数据结构·笔记·程序人生·考研·算法