24、队列的算法实现(数组)
队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
采用数组来保存队列的元素,设立一个队首指针front ,一个队尾指针rear,分别指向队首和队尾元素。则 rear-front即为存储的元素个数!
1、队列的初始化
#define MaxSize 5 //队列最大容量
typedef int DataType;//队列中元素类型
typedef struct Queue{
DataType queue[MaxSize];
int front;//队头指针
int rear;//队尾指针
}SeqQueue;
void InitQueue(SeqQueue *SQ){
if(!SQ)return;
SQ->front = SQ->rear = 0;//将队头和队尾指针同时置0
}
2、判断队列是否已满
bool IsFull(SeqQueue *SQ){
if(SQ->rear == MaxSize){
return true;
}
return false;
}
3、判断队列是否为空
bool IsEmpty(SeqQueue *SQ){
if(SQ->rear ==SQ->front){
return true;
}
return false;
}
4、入队,将元素data插入到队列SQ中
int EnterQueue(SeqQueue* SQ,DataType data){
if(IsFull(SQ)){
cout<<"无法插入元素"<<data<<",队列已满!"<<endl;
return 0;
}
SQ->queue[SQ->rear] = data;//在队尾插入元素data
SQ->rear++;//队尾指针后移一位
return 1;
}
5-1、出队(方法1),将队列中队头的元素data出队,后面的元素向前移动
int DeleteQueue1(SeqQueue* SQ,DataType *data){
if(!SQ || IsEmpty(SQ)){
cout<<"队列为空!"<<endl;
return 0;
}
if(!data)retrun 0;
*data = SQ->queue[SQ->front];//将要出队的数据赋值给data指针指向的地址
for(int i =SQ->front+1;i<SQ->rear;i++){
SQ->queue[i-1]=SQ->queue[i];
}
SQ->rear--;
return 1;
}
5-2、出队(方法二),队首指针向后移动
int DeleteQueue2(SeqQueue *SQ, DataType *data) {
if(!SQ||IsEmpty(SQ)){
cout<<"队列为空!"<<endl;
return 0;
}
if(!data)return 0;
if(SQ->front >= MaxSize){
cout<<"队列已到尽头!"<<endl;
return 0;
}
*data = SQ->queue[SQ->front];
SQ->front = (SQ->front)+1;
return 1;
}
6、获取队首地址,不出队
int GetHead(SeqQueue* SQ,DataType *data){
if(!SQ || IsEmpty(SQ)){
cout<<"队列为空!"<<endl;
}
return *data = SQ->queue[SQ->front];
}
7、清空队列
void ClearQueue(SeqQueue* SQ){
SQ->front = SQ->rear = 0;
}
8、获取队列中元素的个数
int getLength(SeqQueue* SQ){
if(!SQ)return 0;
return SQ->rear-SQ->front;
}
打印队列中的元素
void PrintQueue(SeqQueue* SQ){
if(!SQ)return;
int i=SQ->front;
while(i<SQ->rear){
cout<<SQ->queue[i];
i++;
}
cout<<endl;
}
主函数
int main(void){
SeqQueue *SQ = new SeqQueue;
DataType data =-1;
InitQueue(SQ);
//入队
for(int i=0;i<7;i++){
EnterQueue(SQ,i);
}
//打印队列中的元素
printf("队列中的元素:");
PrintQueue(SQ);
cout<<endl;
//出队
DeleteQueue1(SQ,&data);
cout<<"出队的元素是:"<<data<<endl;
//打印队列中的元素
printf("出队一个元素后,队列中剩下的元素是:");
PrintQueue(SQ);
cout << endl;
system("pause");
return 0;
}