顺序队列
存储类型
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;
}
}