1.队列,和现实生活中的规则类似,先进先出
2.队尾只允许元素进入,队头只允许元素退出
3.用数组来实现队列的顺序存储,无论哪一段都可以作为队头或者队尾
SeqQueue.h头文件
#ifndef SEQQUEUE_H
#define SEQQUEUE_H
#include<stdlib.h>
#include<stdio.h>
typedef struct SeqQueue{
void* data[1024];
int size;
}SeqQueue;
//初始化队列
SeqQueue* Init_SeqQueue();
//入队
void Push_SeqQueue(SeqQueue* queue,void* data);
//返回队头元素
void* Front_SeqQueue(SeqQueue* queue);
//出队
void Pop_SeqQueue(SeqQueue* queue);
//返回队尾元素
void* Back_SeqQueue(SeqQueue* queue);
//返回大小
int Size_SeqQueue(SeqQueue* queue);
//清空队列
void Clear_SeqQueue(SeqQueue* queue);
//销毁队列
void FreeSpace_SeqQueue(SeqQueue* queue);
#endif
SeqQueue.c源文件
初始化队列
SeqQueue* Init_SeqQueue(){
SeqQueue* queue =(SeqQueue*)malloc(sizeof(SeqQueue));
for(int i=0;i<=1024-1;i++)
queue->data[i]=NULL;
queue->size=0;
return queue;
}
入队
void Push_SeqQueue(SeqQueue* queue,void* data){
//规定数组的左边为队列的头部
if(queue==NULL)
return;
if(data==NULL)
return;
if(queue->size==1024)
return;
queue->data[queue->size]=data;
//关键步骤:直接将容量作为数组最后一个元素的下标
queue->size++;
}
返回队头元素
void* Front_SeqQueue(SeqQueue* queue){
if(queue==NULL)
return NULL;
if(queue->size==0)
return NULL;
return queue->data[0];
}
出队
void Pop_SeqQueue(SeqQueue* queue){
if(queue==NULL)
return;
if(queue->size==0)
return;
for(int i=0;i<queue->size-1;i++)
queue->data[i]=queue->data[i+1];
queue->size--;
}
返回队尾元素
void* Back_SeqQueue(SeqQueue* queue){
if(queue==NULL)
return NULL;
if(queue->size==0)
return NULL;
return queue->data[queue->size-1];
}
返回大小
int Size_SeqQueue(SeqQueue* queue){
if(queue==NULL)
return -1;
return queue->size;
}
清空队列
void Clear_SeqQueue(SeqQueue* queue){
if(queue==NULL)
return;
queue->size=0;
}
销毁队列
void FreeSpace_SeqQueue(SeqQueue* queue){
if(queue==NULL)
return;
free(queue);
}
main.cpp主函数测试文件
#include <iostream>
#include <string.h>
#include "SeqQueue.h"
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct goal{
string name;
int date;
}goal;
int main(int argc, char** argv) {
goal g1,g2;
g1.date=20010927;
g1.name="JSL";
g2.date=20011228;
g2.name="HYH";
SeqQueue* queue=Init_SeqQueue();
Push_SeqQueue(queue,&g1);
Push_SeqQueue(queue,&g2);
//指针类型取地址,别忘了
cout<<"这是关于"<<(Size_SeqQueue(queue))<<"个人的故事~"<<endl;
while(queue->size!=0)
{
goal* temp=(goal*)Front_SeqQueue(queue);
//取出指针并且强转
cout<<(temp->name)<<":"<<(temp->date)<<endl;
Pop_SeqQueue(queue);
//每输出一次即刻将队头元素弹出
//注意:Pop_SeqQueue方法中已经包含了size--的操作,此时如果再加一条,就会一次性减2次
}
FreeSpace_SeqQueue(queue);
return 0;
}
测试截图: