顺序队列 :
/*队列:在内存中开辟一块空间然后将(这块空间是一块数组用模拟指针指向)
和链表不同:链表的一个结点就要开辟一块空间
一直都没有进行练习,但是这次 对树进行层次遍历会用到,
而层次遍历 在AC自动机中也会用到;所以。。。。
*/
/*
顺序队列:
初始化队列,进队 ,出队,判断队列满不满,判断队列是不是空
*/
/*
#include <stdio.h>
#define Max 9999
typedef struct{
char data[Max];
int fr;
int re;
}Sqe;
Sqe *InitSQque()
{
Sqe *p;
p=(Sqe *)malloc(sizeof(Sqe));
p->re=-1;
p->fr=-1;
return p;
}
//进队,在-1处不能放数据
int enSQque(Sqe *s,char e[])
{
if(s->re==Max-1)
{
printf("队列已满\n");
return 0; //如果re到达队尾,退出
}
int m=0,i=0;
m=strlen(e);
for(i=0;i<m;i++)
{
s->re++; // 先进行加1,使re然后好安排数据
s->data[s->re]=e[i];
}
return 0;
}
int Pop(Sqe *s)
{
char e;
if(s->fr==s->re)
{
printf("队列已经为空\n");
return 0;
}
s->fr++;
e=s->data[s->fr];
printf("%c ",e);
return 0;
}
//判断队列是否为空
int SQEmpty(Sqe *s)
{
if(s->fr==s->re)
return 1; // 1 :表示队列已经空
return 0;
}
//销毁队列
int DelSQque(Sqe *s)
{
free(s); //因为只有一个结点(只开辟了一块空间位置!!!)
return 0;
}
int main()
{
int i,m;
char j,k;
char c[132];
Sqe *S,*p,*fr,*re;
S=InitSQque();
gets(c);
enSQque(S,c);
while(SQEmpty(S)==0)
{
Pop(S);
}
return 0;
}
环形队列:
/*
环形队列注意他的队空和队满的条件
*/
#include <stdio.h>
#define Max 9999
typedef struct{
char data[Max];
int fr;
int re;
}HSqe;
//初始化,给队列开辟一块空间
HSqe *InitSQque()
{
HSqe *p;
p=(HSqe *)malloc(sizeof(HSqe));
p->re=0;
p->fr=0;
return p;
}
//进队
int enHSqe(HSqe *s,char e[])
{
if((s->fr+1)%Max==s->re)//s->fr的值只会在0到Max之间变化,不会越界,下面给出解释
{
return 0; //队满
}
int m=0,i;
m=strlen(e);
for(i=0;i<m;i++)
{
s->re=(s->re+1)%Max; //因为只是环形队列,所以不能一直加1,要不然必然会出错
s->data[s->re]=e[i]; //所以想要指针后移,方法是:将re指针加1,然后对队列长度取余
}
return 0;
}
int Pop(HSqe *s)
{
//队空
char e;
s->fr=(s->fr+1)%Max; //这个和re指针后移是一样的
e=s->data[s->fr];
printf("%c,",e);
return 0;
}
//判断队是否为空
int HSqeEmpty(HSqe *s)
{
if(s->re==s->fr)
return 1; // 1,表示队空
return 0;
}
//销毁队列
int DestroyHSqe(HSqe *s)
{
free(s);
return 0;
}
int main()
{
HSqe *S;
char e[1234],j;
int m=4,i;
S=InitSQque();
//优化一下输入方式
gets(e);
enHSqe(S,e);
//输出没有问题
while(HSqeEmpty(S)==0)
{
Pop(S);
}
return 0;
}