注意:进行插入一个元素是要判断
- 顺序队列
注意:(1)进队操作要先判断栈是否满(由于顺序队列不好判断 − > -> −>循环队列)
(2) 先将数据放入尾指针所指的数组,再尾指针++。
L.data[L.rear]=e ; L.rear++;
void init(squeue &L) //初始化
{
L.front=L.rear=0;
}
bool enter(squeue &L,int e)
{
if (队满)
return false;
L.data[L.rear]=e;
L.rear++;
return true;
}
int out(squeue &L) //出队
{
int x=L.data[++L.rear];
return x;
}
- 循环队列
void init_(squeue &L)
{
L.front=L.rear=0
}
bool enter(squeue &L,int e) //进队
{
if((L.rear+1)%maxsize==L.front)
return false;
L.data[L.rear]=e;
L.rear=(L.rear+1)%maxsize;
return true;
}
bool out(squeue &L) //出队
{
if (L.front==L.rear) //判断队列是否为空
return false;
L.front=(L.front+1)%maxsize;
int x=L.data[L.front];
return true;
}
- (1)带头结点的链式队列的基本操作
注意 1)链式队列要申请两个结构体
2)在队列出队时应判断要出队的元素是否是队列中唯一的元素
void out(Linkqueue &L)
{
int m=L.front->next->data;
DuiLinkNode *p=L.front->next;
L.front->next=L.front->next->next;
if (L->rear==p) //用于判断队列中是否是仅有一个元素
L->rear=L->front;
free(p);
}
**
if (L->rear==p) //用于判断队列中是否是仅有一个元素 L->rear=L->front;
**
#include<stdio.h>
#include<stdlib.h>
typedef struct DuiLinkNode
{
int data;
struct DuiLinkNode *next;
}DuiLinkNode;
typedef struct
{
DuiLinkNode *front,*rear;
}Linkqueue;
void init(Linkqueue &L)
{
L.front=L.rear=(DuiLinkNode *)malloc(sizeof(DuiLinkNode));
L.front->next=NULL;
}
void enter(Linkqueue &L)
{
int x=0;
printf("请输入:\n");
scanf("%d",&x);
while(x!=999)
{
DuiLinkNode *s=(DuiLinkNode *)malloc(sizeof(DuiLinkNode));
s->data=x;
s->next=L.rear->next;
L.rear->next=s;
L.rear=s;
printf("请输入:\n");
scanf("%d",&x);
}
}
void out(Linkqueue &L)
{
int m=L.front->next->data;
DuiLinkNode *p=L.front->next;
L.front->next=L.front->next->next;
if (L->rear==p) //用于判断队列中是否是仅有一个元素
L->rear=L->front;
free(p);
}
void print(Linkqueue L)
{
DuiLinkNode *p=L.front->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
void destory(Linkqueue L)
{
DuiLinkNode *p=L.front->next,*q;
free(L.front);
while(q!=NULL)
{
q=p->next;
free(p);
p=p->next;
}
}
int main()
{
Linkqueue L;
init(L);
enter(L);
print(L);
printf("\n");
out(L);
print(L);
destory(L);
return 0;
}
(2)不带头结点的链式队列的基本操作
#include<stdio.h>
#include<stdlib.h>
typedef struct DuiLinkNode
{
int data;
struct DuiLinkNode *next;
}DuiLinkNode;
typedef struct
{
DuiLinkNode *front,*rear;
}Linkqueue;
void init(Linkqueue &L) //初始化
{
L.front=L.rear=NULL;
}
void enter(Linkqueue &L) //进队列
{
int x=0;
printf("请输入:\n");
scanf("%d",&x);
L.front=(DuiLinkNode *)malloc(sizeof(DuiLinkNode));
L.front->next=NULL;
L.front->data=x;
L.rear=L.front;
while(1)
{
printf("请输入:\n");
scanf("%d",&x);
if(x>=999)
break;
DuiLinkNode *s=(DuiLinkNode *)malloc(sizeof(DuiLinkNode));
s->data=x;
s->next=L.rear->next;
L.rear->next=s;
L.rear=s;
}
}
bool empty(Linkqueue L) //判断是否为空
{
if (L.front==NULL)
return true;
else
return false;
}
void enter_one(Linkqueue &L,int x) //只进一个元素
{
if(empty(L)==true)
{
L.front=(DuiLinkNode *)malloc(sizeof(DuiLinkNode));
L.front->next=NULL;
L.front->data=x;
L.rear=L.front;
}
else
{
DuiLinkNode *s=(DuiLinkNode *)malloc(sizeof(DuiLinkNode));
s->data=x;
s->next=L.rear->next;
L.rear->next=s;
L.rear=s;
}
}
bool out(Linkqueue &L) //出队
{
int m=L.front->data;
DuiLinkNode *p=L.front;
if (empty(L)==true)
return false;
L.front=L.front->next;
free(p);
return true;
}
void print(Linkqueue L) // 遍历
{
DuiLinkNode *p=L.front;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
void destory(Linkqueue L) //销毁队列
{
DuiLinkNode *p=L.front->next,*q;
free(L.front);
while(q!=NULL)
{
q=p->next;
free(p);
p=p->next;
}
}
int main()
{
Linkqueue L;
init(L);
if(empty(L))
printf("YES\n");
else
{
printf("NO\n");
}
int x=0;
while(1)
{
printf("请输入:\n");
scanf("%d",&x);
if(x>=999)
break;
enter_one(L,x);
}
//enter(L);
print(L);
printf("\n");
out(L);
print(L);
destory(L);
return 0;
}
- 报数问题(李春葆书P108)
#include<stdio.h>
#include<stdlib.h>
#define maxsize 8
typedef struct
{
int data[maxsize];
int front,rear;
}squeue;
void init(squeue *&s) //初始化
{
s=(squeue *)malloc(sizeof(squeue));
s->front=s->rear=-1;
}
bool enter(squeue *&s,int e) //进队列
{
if (((s->rear+1)%maxsize)==s->front)//判满
return false;
s->rear=(s->rear+1)%maxsize;
s->data[s->rear]=e;
return true;
}
int out(squeue *&s) //出队列
{
if(s->front==s->rear) //判断队列是否为空
return -1;
else
{
s->front=(s->front+1)%maxsize;
return s->data[s->front];
}
}
bool empty(squeue *s)
{
if(s->front==s->rear)
return true;
return false;
}
void destory(squeue *&s) //xiaohuidui.ie
{
free(s);
}
void number(int n)
{
int j=0;
squeue *s;
init(s);
for(int i=1;i<=n;i++)
{
enter(s,i);
}
// printf("==========\n");
while(!empty(s))
{
printf("%d ",out(s));
//思路:报1的出队,报2的出队后进队,so一直是:一个元素出队+直接输出后,下一个元素出队+进队。
//保持这样的规律直到队为空
if(!empty(s))
{
int a=out(s);
enter(s,a);
}
}
printf("\n");
}
int main()
{
number(8);
return 0;
}