#include <iostream>
#define MaxSize 10
using namespace std;
/* 顺序存储实现队列 */
typedef struct{
int data[MaxSize]; //静态数组存放数据元素(一片连续空间)
int front,rear; //队头、队尾指针 (队头指针指向队头元素,队尾指针指向队尾的后一个元素(接下来应该插入数据元素的位置)
}SqQueue;
//初始化
void InitQueue(SqQueue &Q){
Q.rear=Q.front=0; //rear和front值相同,地址不同,初试状态,队头队尾指针指向0
}
//初始化(当rear指向的是队尾元素)
void InitQueue2(SqQueue &Q){
Q.front=0;
Q.rear=MaxSize-1; //这样插入第一个元素时rear在0;
}
//判断队列是否为空
bool QueueEmpty(SqQueue Q){
if(Q.rear==Q.front)
return true;
else
return false;
}
//入队操作(只能从队尾方向)
bool EnQueue(SqQueue &Q,int x){
if((Q.rear+1)%MaxSize==Q.front) //队列是否存满?静态数组容量有限;而这个判定条件不能是rear==MaxSize,因为存满后从队头出队,rear也==MaxSize;
return false; //当rear下一个位置是front,已经存满,而rear当前存储空间浪费掉
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize; //当存满后,rear==MaxSize,又重新指到0的位置,若队头有出队,可以在队头继续插入;也成为循环队列
return true;
}
//入队操作(rear指向当前队尾元素时)
bool Enqueque2(SqQueue &Q,int x){
if((Q.rear+1)%MaxSize==Q.front)
return false;
Q.rear=(Q.rear+1)%MaxSize;
Q.data[Q.rear]=x;
return true;
}
//出队(从队头)操作
bool DeQueue(SqQueue &Q,int x){
if(Q.rear==Q.front) //队列为空
return false;
x=Q.data[Q.front]; //带回被删除值
Q.front=(Q.front+1)%MaxSize;
return true;
}
//读取队头元素
bool GetHead(SqQueue Q,int x){
if(Q.rear==Q.front) //空队列
return false;
x=Q.data[Q.front];
return true;
}
//(rear+MaxSize-front)%MaxSize==队列元素个数
//其他判断队列是否满了的方法
//定义一个变量size作为队列当前长度
typedef struct{
int data[MaxSize];
int front, rear;
int size;
}SqQueue2;
void InitQueue2(SqQueue2 &Q){
Q.front=Q.rear=Q.size=0; //作插入和删除时size++或size--
}
//定义一个type判断最近一次的操作是删除0还是插入1(只有删除操作队列才会变空,插入操作才会使队列变满)
typedef struct{
int front,rear;
int tag; //当front==rear && tag==1,队满;当front==rear && tag==0,队空
}SqQueue3;
void testQueue(){
SqQueue Q; //声明一个队列
InitQueue(Q);
}
int main(int argc, char** argv) {
return 0;
}
【数据结构笔记】线性表-队列(顺序存储实现)
最新推荐文章于 2024-09-15 16:31:43 发布