【考研】队列与队列的应用

顺序队列


存储类型

typedef struct{
	int data[MaxSize];		//存放队列元素 
	int rear , front;		//队尾指针和队头指针 
}sqQueue;

基本操作


初始化

void InitQueue(SqQueue &Q){
	Q.front == Q.rear == 0;
}

入队

//队不满时,先送值到队尾元素,再将队尾指针加1
bool enQueue(SqQueue &Q , ElemType x){
	if((Q.rear+1)%MaxSize == Q.front )//队满 
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear+1)%MaxSize;
	return true;
} 

出队

//队不空时,先取队头元素值,再将队头指针加1
bool DeQueue(SqQueue &Q ,ElemType x){
	if(Q.front == Q.rear)	//队空 
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front+1)%MaxSize;
	return true;
}

链式队列


存储结构

//链式队列结点 
typedef struct 
{
	ElemType data ;
	struct LinkNode *next ;
}LinkNode;

//链式队列
typedef struct 
{
	LinkNode *front,*rear ;   //队头和队尾指针 
}LinkQueue;

基本操作

入队

void EnQueue(LinkQueue &Q , ElemType x){
	s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	Q.rear->next = s;
	Q.rear = s; 
}

出队

bool DeQueue(LinkQueue &Q , ElemType &x){
	if(Q.rear == Q.front ) return false ; //空队 
	p = Q.front->next ;
	x = p->data ;
	Q.front->next = p->next ;
	if(Q.rear == p) //若原队列中只有一个结点,删除后变空 
		Q.rear = Q.front ;
	free(p) ;
	return true ;
}

循环队列


基本操作


初始化

void InitQueue(SqQueue &Q){
	S.rear = Q.front = 0;	//初始化队首队尾指针 
}

判空

bool isEmpty(SqQueue &Q){
	if(Q.rear == Q.front)	//判空条件 
		return true;
	else
		return false;
}

入队

bool Push (SqQueue &Q , ElemType x){
	if((Q.rear+1)%MaxSize == Q.front)
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear+1)%MaxSize;
	return true;
} 

出队

bool Pop(SqQueue &Q , ElemType x){
	if(Q.rear == Q.front)//空 
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front+1)%MaxSize;
	return true;
}

算法


求斐波那契数列的第n项

int Fib(int n){
	if( n== 0 ) return 0 ;	//1.递归边界
	else if(n == 1) return 1 ; //2.递归式 
	else return Fib(n-1)+Fib(n-2) ;
}

模仿汽车轮渡口

SqQueue Q;		//Q为载渡队列 
SqQueue Q1;		//Q1是客车队列 
SqQueue Q2;		//Q2是货车队列 

void Manager(){
	int i=0 , j=0;		//j是船上车子数量 ,i是船上客车的数量 
	while( j < 10){
		if( !isEmtry(Q1) && i < 4 ){	//客车队列不空,则未上足4辆
			DeQueue(Q1 , x);
			EnQueue(Q , x );
			i++;		//客车数+1
			j++;			
		}
		else if( i == 4 && !isEmtry(Q2)){	//客车已上足4辆
			DeQueue(Q2 , x);
			EnQueue(Q2 , x);
			i++;
			j++
		}
		else{	//其他情况(客车队列空或货车队列空)
			while( j <10 && i<4 && !isEmtry(Q2)){
				DeQueue(Q2 , x);
				EnQueue(Q2 , x);
				i++;
				j++;				
			}
			i = 0;	
		}
		if(isEmtry(Q1) && if isEmtry(Q2))	//若货车和客车加起来不足10辆
			j =11;
	}	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值