队列

注意:进行插入一个元素是要判断

  1. 顺序队列
    注意:(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;
  }
  1. 循环队列
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)带头结点的链式队列的基本操作
    注意 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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值