c语言数据结构学习心得——队列
队列
只允许在一端进行插入,在另一端进行删除的线性表
队头(Front):允许删除的一端(队首)
队尾(Rear):允许插入的一端
FIFO:先进先出
不要求从数组首位开始存储队列
#define MaxSize 50 //定义队列中元素的最大个数 typedef struct{ ElemType data[MaxSize]; //存放队列元素 int front,rear; //队头指针和队尾指针 }SqQueue;
循环队列
其中,首尾相连的顺序存储的队列叫循环队列
入队:rear=(rear+1)%MaxSize
出队:front=(front+1)%MaxSize
队空:front=rear
队满:数组中仍有一个空余单元
队满时:(rear-front+MaxSize)%MaxSize
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; }
2.出队
bool DeQueue(SqQueue &Q,ElemType &x){ if(Q.rear==Q.front) return false;//队满 x=Q.data[Q.front]; Q.rear=(Q.front+1)%MaxSize; return true; }
链式队列
typedef struct{ //链式队列结点 ElemType data; struct Link Node *next; }Link Node;
typedef struct{ //链式队列
ElemType data;
Link Node *front,*rear;//队头和队尾指针
}Link Queue;
1.入队
void EnQueue(LinkQueue &Q,ElemType x){ s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=x; s->next=NULL; Q.rear->next=s; Q.rear=s; }
2.出队
bool DeQueue(LinkQueue &Q,ElemType &x){ if(Q.front==Q.rear) 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; }
双端队列
具体见上传图片
总结