顺序队列(循环队列)
#ifndef __SEQUEUE__
#define __SEQUEUE__
#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef int mytype;
typedef struct{
mytype data[N];
int head;
int tail;
}Sequeue;
Sequeue* create_sequeue(void);
void print_sequeue(Sequeue*);
void add_sequeue(Sequeue*,mytype);
mytype remove_sequeue(Sequeue*);
int strlen_sequeue(Sequeue*);
void free_sequeue(Sequeue**);
#endif
#include "./sequeue.h"
//创建队列
Sequeue* create_sequeue(){
Sequeue *se = (Sequeue*)malloc(sizeof(Sequeue));
if(se==NULL){
printf("创建队列失败!\n");
return NULL;
}
printf("创建队列成功!\n");
se->head=se->tail=0;
return se;
}
//判空
int isEmpty(Sequeue* se){
return se->head==se->tail ? 1 : 0 ;
}
//判满
int isFull(Sequeue* se){
return (se->tail+1)%N==se->head ? 1 : 0 ;
}
//遍历
void print_sequeue(Sequeue* ps){
if(ps!=NULL){
if(isEmpty(ps)){
printf("当前队列元素为空!\n");
return;
}
for(int i=ps->head;i!=ps->tail;i=(i+1)%N)
printf("当前数据为:%d\n",ps->data[i]);
return;
}
printf("队列不存在\n");
}
//入队
void add_sequeue(Sequeue* as,mytype num){
if(as!=NULL){
if(!isFull(as)){
as->data[as->tail]=num;
as->tail=(as->tail+1)%N;
return;
}
printf("队列已满,无法入队!\n");
return;
}
printf("队列不存在!\n");
}
//出队//拿数据
mytype remove_sequeue(Sequeue* rs){
if(rs!=NULL){
if(!isEmpty(rs)){
mytype a = rs->data[rs->head];
rs->head=(rs->head+1)%N;
return a;
}
printf("队列已空,无法出队!\n");
return (mytype)-1;
}
printf("队列不存在!\n");
return (mytype)-1;
}
//队列长度
int strlen_sequeue(Sequeue* ss){
return (ss->tail-ss->head+N)%N;
// return ss->tail>ss->head ? ss->tail-ss->head : N-ss->head+ss->tail;
}
//释放队列
void free_sequeue(Sequeue** fs){
(*fs)->head = (*fs)->tail = 0;
free(*fs);
*fs=NULL;
}
#include "./sequeue.h"
int main(int argc, const char *argv[])
{
Sequeue *seq = create_sequeue();
if(seq==NULL)
return 0;
int jump=1,choose,num;
while(jump){
printf("请选择所需操作: 0:退出 1:遍历 2:入队 3:出队 4:队列长度 5:释放队列\n");
scanf("%d",&choose);
switch(choose){
case 0:{
jump=0;
break;
}
case 1:{
print_sequeue(seq);
break;
}
case 2:{
printf("请输入您想插入的内容!\n");
scanf("%d",&num);
add_sequeue(seq,num);
break;
}
case 3:{
printf("移除数据为:%d\n",remove_sequeue(seq));
break;
}
case 4:{
printf("该队列长度为:%d\n",strlen_sequeue(seq));
break;
}
case 5:{
free_sequeue(&seq);
if(seq==NULL)
printf("该队列已完全释放!\n");
else
printf("释放失败!\n");
break;
}
default:{
break;
}
}
}
return 0;
}