当前位置: 首页 > news >正文

考研复习之队列

循环队列

队列为满的条件

      队列为满的条件需要特殊处理,因为当队列满时,队尾指针的下一个位置应该是队头指针。但是,我们不能直接比较 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;
	
}

相关文章:

  • [Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝
  • 强大的AI网站推荐(第三集)—— AskO3
  • ffmpeg介绍
  • 【数据标准】数据标准化框架体系-对象类数据标准
  • 【原创首发】开源基于AT32 SIP/VOIP电话
  • 正交分析法 + Prompt Optimizer:五维复杂测试用例设计的终极指南**
  • 适配器模式 (Adapter Pattern)
  • SpringMVC的执行流程剖析和源码跟踪
  • Blazor+PWA技术打造全平台音乐播放器-从音频缓存到离线播放的实践之路
  • Jupyter Notebook 常用命令(自用)
  • Spring6:7 事务
  • [项目]基于FreeRTOS的STM32四轴飞行器: 十.检测遥控器
  • Day23: 数组中数字出现的次数
  • 免费Typora1.8.6安装教程
  • 操作系统WIN11无法出现WLAN图标(解决方案)
  • 链表题型-链表操作-JS
  • Android Compose 流式布局(FlowRow、WrapContent)源码深度剖析(十一)
  • 用 pytorch 从零开始创建大语言模型(六):预训练无标注数据
  • 使用AI一步一步实现若依(20)
  • C++基础系列【27】Raw String Literal
  • 近七成科创板公司2024年营收增长,285家营收创历史新高
  • 圆桌|如何应对特朗普政府的关税霸凌?一种联合国视角的思考
  • 欢迎回家!神十九返回舱成功着陆
  • 屠呦呦当选美国科学院外籍院士
  • 李铁案二审驳回上诉,维持一审有期徒刑20年的判决
  • 腾讯重构混元大模型研发体系:成立大语言和多模态模型部,提升AI长期技术作战能力