队列学习笔记

一、队列

  • 队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表
  • 先进先出、后进后出、操作受限的线性表
  • 允许插入的一端被称为队尾(rear) 允许删除的一端被称为队头(front)

二、循环队列

  • 队列头尾相接的顺序结构 ,把整个数组理解成一个圈圈

------->示例代码

!!!头文件

#pragma once
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int State;  //给整形起一个别名 专门用来表示状态
#define State_ok 1
#define State_Fall 0

#define	MAX_SIZE 255

typedef struct
{
	int id;
	char name;
}ElementType;

//循环队列结构
typedef struct {
	ElementType data[MAX_SIZE];    
	int front;		//队头指针
	int rear;       //队尾指针
	int length;     //队列长度
}SeqQueue;

void Init(SeqQueue *queue);
//队列判断
State IsSeqQueueEmpty(SeqQueue *queue);
State IsSeqQueueFull(SeqQueue *queue);
//入队
State OfferSequeue(SeqQueue *queue, ElementType element);
//出队
State PollSequeue(SeqQueue *queue, ElementType * element);
//打印
void PrintSequeue(SeqQueue *queue);

!!!函数实现

#include <iostream>
using namespace std;
#include"SeqQueue.h"
//初始化
void Init(SeqQueue *queue)
{
	if (queue == NULL)
	{
		queue = (SeqQueue *)malloc(sizeof(SeqQueue));
	}
	queue->length = 0;
	queue->front = 0;
	queue->rear = 0;
}
//判断队列是否为空/为满
State IsSeqQueueEmpty(SeqQueue *queue)
{
	//如果队头指针和队尾指针相同,队列为空
	return queue->front == queue->rear ? State_ok : State_Fall;
}
State IsSeqQueueFull(SeqQueue *queue)
{
	if ((queue->rear + 1) % MAX_SIZE == queue->front)
	{
		return true;
  }
	else
	{
		return false;
	}
}
//出队和入队
State OfferSequeue(SeqQueue *queue, ElementType  element)
{
	//队尾插入元素
	if (IsSeqQueueFull(queue))
		return State_Fall;
	queue->data[queue->rear] = element;
	queue->rear = (queue->rear + 1) % MAX_SIZE;  //因为是循环队列嘛
	queue->length++;
	return State_ok;
	//队头不变
}
State PollSequeue(SeqQueue *queue, ElementType * element)
{
	if (IsSeqQueueEmpty(queue))
		return State_Fall;
	//先取出队头元素
	*element = queue->data[queue->front];
	//把队头移动向下一位置
	queue->front = (queue->front + 1) % MAX_SIZE;
	queue->length--;

}
//从数组内部存储角度来讲并没有出队 所以应该是从队头遍历到队尾
void PrintSequeue(SeqQueue *queue)
{
	for (int i = queue->front; i < queue->rear; i++)
		cout << queue->data[i].id << "	" << queue->data[i].name << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值