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;
}
测试截图: