队列原理与实现

队列创建并初始化

入队和出队

清空队列与获取元素个数 打印队列

0.  队列的原理:
	就像骚扰女明星,只有我先搞完,出来后,才能你上,先进先出。
1.创建队列并初始化:
#include <iostream>
#include <iomanip>
#include <Windows.h>

#define MaxSize 5	//设置队列最大元素

using namespace std;

typedef int DataType;	//队列的元素类型

typedef struct Queue {
 	DataType quque[MaxSize];
 	int front; //队头指针
 	int rear; //队尾指针
}SeqQueue;

//队列初始化
void InitQueue(SeqQueue* SQ) {
 if (!SQ) return;
 
//将对头指针与队尾指针初始化为0
 SQ->front = SQ->rear = 0;	
}



int main(void){	
	//创建队列
	SeqQueue* SQ = new SeqQueue;
	DataType data;
	
	//初始化
	InitQueue(SQ);


	system("pause");
	return 0;
}
2.入队与出队前的准备
   入队:需要判断队列是否为满
   出队:需要判断队列是否为空
//判断队列是否为满
int IsFull(SeqQueue* SQ) {
 if (!SQ) return 0;
 if (SQ->rear == MaxSize) {
  return 1;
 }
 return 0;
}

//判断队列为空
bool IsEmpty(SeqQueue* SQ) {
 if (!SQ) return false;
 if (SQ->front == SQ->rear) {
  return true;
 }
 return false;
}
入队与出队实现:
//入队

//判断队列是否已满,将对尾指向data,队尾指针在后移动一位
int EnterQueue(SeqQueue* SQ, DataType data) {
if (!SQ) return 0;	
	//判断队列是否已满
 if (IsFull(SQ)) {
 cout << "无法插入元素:" << data << "队列已满!" << endl;
  return 0;
 }
 
 SQ->quque[SQ->rear] = data; //在队尾插入元素
 SQ->rear++;     //队尾指针后移一位
 return 1;
}

//出队
//判断是否为空,把对头元素赋值给data,再把后边元素前移
//方法一:
bool DeleteQueue1(SeqQueue* SQ, DataType* data) {
 if (!SQ || IsEmpty(SQ)) {
 cout << "队列为空!" << endl;
  return false;
 }
 
//防御式编程必不可少
if (!data) {
  cout << "data为空" << endl;
  return false;
 }

//移动后边的元素
for (int i = SQ->front+1; i < SQ->rear; i++) { 
  SQ->quque[i - 1] = SQ->quque[i];
 }

 SQ->rear--;
 return true;

//出队
//判断元素是否为空,头元素出队赋值给data,把对头元素加一,指向后一个元素,省去移动时间.
//坏处:空间越来越小
//方法二:
bool DeleteQueque2(SeqQueue* SQ, DataType* data) {
 if (!SQ || EmptyQueque(SQ)) {
  cout << "队列为空!" << endl;
  return false;
}

if (!data) return false;

 if (SQ->fron >= MaxSize) {
  cout << "队列已到尽头!" << endl;
  return false;
 }
 
 *data = SQ->quque[SQ->fron];

 SQ->fron = (SQ->fron) + 1;
	 return true;
}
3.清空队列
//清空队列
//将前置指针与后置指针指向0
void ClearQueque(SeqQueue* SQ) {
 if (!SQ) return;
 SQ->fron = SQ->rear = 0;
 return;
}


//获取队列元素
//让后置元素减去前置元素得到元素个数
int Getlength(SeqQueue* SQ) {
 if (!SQ) return 0;
//得到元素个数
 return SQ->rear - SQ->fron;
}

//打印队列
void Print(SeqQueue* SQ) {
 if (!SQ) return;
 int i = SQ->fron;
 while (i < SQ->rear) {
  cout << setw(4) << SQ->quque[i];
  i++;
 }
 cout << endl;
}
main:
int main(void){
 SeqQueue* SQ = new SeqQueue;
 DataType data;
 
	//初始化
 InitQueque(SQ);
	//入队7个元素
 for (int i = 0; i < 7; i++) {
  	EnterQueque(SQ, i);
 }
 cout << "打印队列中的元素(总共):" << Getlength(SQ) << "个";
 Print(SQ);
 cout << endl;
 
	//出队头元素
DeleteQueque1(SQ, &data);
  cout << "出对的元素:" << data << endl;
  cout << "出队一个元素后,队列中剩下:";
  Print(SQ);
  cout << endl;
  cout << "打印队列中的元素(总共):" << Getlength(SQ) << "个" << endl;


system("pause");
return 0;

猜你喜欢

转载自blog.csdn.net/qq_45140193/article/details/107930497