关于循环队列顺序表示和实现

队列的性质

队列满足的基本性质为先进先出,后进后出。

eg:生活中类似于排队打饭一样,先排队的先打饭。

一,关于顺序栈的结构体表示

结构体定义

    struct Node
{
    int data[MaxSize];             //存放队列的数组
    int front;                            //队尾
    int rear;                             //队头
};

图解:

如上图可以得出:

  • 判断队列满的方法就是队尾加1除以队长跟队头位置是否相等。即(S->rear+1)%Size==S->front
  • 判断队列为空的方法就是队头跟队尾位置是否相等。即S->front==S->rear
  • 这里可以当作,队列满是看队头是否能追上队尾
  • 队列空,是看队尾是否能追上队头
  • 此处将n-1就定义为满队列的原因是,若全部都存入数据,则S->front与S->rear相等,与空栈情况一样。

循环队列的定义

Node *Init()
{
	Node *S = new Node;
	S->front = S->rear = 0;
	return S;
}

即简单初始化队头队尾,都指向队列底就行,也就是赋值为0.


入队

void Enter(Node &S)
{
	if ((S.rear + 1) % MaxSize != S.front)    //判断是否为满队列
	{
		cout << "输入要进入队列的值:";
		cin >> *(S.data + S.rear);
		S.rear = (S.rear + 1) % MaxSize;
	}
	else
	{
		cout << "队列已满" << endl;
	}
}

先判断是否为满队列,若队列已满,则不能继续存数据


出队列

void Delete(Node &S)
{
	if (S.front != S.rear)                  //队列不为空
	{
		S.front = (S.front + 1) % MaxSize;
	}
	else
	{
		cout << "队列为空" << endl;
	}
}

队列的性质是先进先出,所以先判断队列是否为空,若不为空,则先出先进的,即存放在队尾的数据


显示先入队列的数据

void Show(Node *S)
{
	cout << "队头元素为:";
	cout << *(S->data + S->front) << endl;
}

代码:

#include<iostream>
using namespace std;

#define MaxSize 20

struct Node
{
	int data[MaxSize];
	int front;
	int rear;
};

Node *Init()
{
	Node *S = new Node;
	S->front = S->rear = 0;
	return S;
}

void Enter(Node &S)
{
	if ((S.rear + 1) % MaxSize != S.front)
	{
		cout << "输入要进入队列的值:";
		cin >> *(S.data + S.rear);
		S.rear = (S.rear + 1) % MaxSize;
	}
	else
	{
		cout << "队列已满" << endl;
	}
}

void Delete(Node &S)
{
	if (S.front != S.rear)                  //队列不为空
	{
		S.front = (S.front + 1) % MaxSize;
	}
	else
	{
		cout << "队列为空" << endl;
	}
}

void Show(Node *S)
{
	cout << "队头元素为:";
	cout << *(S->data + S->front) << endl;
}


int main()
{
	Node *S = Init();
	Enter(*S);
	Enter(*S);
	Enter(*S);
	Show(S);
	Delete(*S);
	Show(S);
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/106423802