队列的性质
队列满足的基本性质为先进先出,后进后出。
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");
}