数据结构:双端队列

#数据结构定义:

#define DataType int
#define maxn 10005//数组不能有负数下标,所以实际长度位maxn的两倍
struct queue{
DataType data[maxn<<1];maxn*2
int head,tail;//tail-head==1为空
}

#队首入队

void QueueEnqueueFront(struct Queue *que, DataType dt){
--que->head;
que->data[que->head]=dt;
}

#队尾入队

void QueueEnqueueRear(struct Queue *que, DataType dt){
que->tail++;
que->data[que->tail]=dt;
}

#队首出队

void QueueDequeueFront(struct Queue* que){
que->head++;
}

#队尾出队

void QueueDequeueRear(struct Queue* que){
que->tail--;
}

#清空队列

void QueueClear(struct Queue* que){
que->head=maxn;
que->tail=que->head-1;
}

#只读接口包含:获取队首元素、获取队尾元素、获取队列大小、队列的判空,实现如下:

DataType QueueGetFront(struct Queue *que){
return que->data[que->head];
}
DataType QueueGetRear(struct Queue *que){
return que->data[que->tail];
}
int QueueGetSize(struct Queue *que){
return que->tail-que->head+1;
}
int QueueIsEmpty(struct Queue *que){
return !QueueGetSize(que);
}

#双端队列的链表实现

#define DataType int
Struct QueueNode;
struct QueueNode{
DataType data;
struct QueueNode *prev;
struct QueueNode *next; 
}
struct queue{
struct QueueNode *tail,*head;
int size;
}

#创建节点

struct QueueNode *QueueCreateNode(DataType dt){
struct QueueNode *vtx=(struct QueueNode*)malloc(sizeof(struct QueueNode));
vtx->data=dt;
vtx->next=vtx->prev=null;
return vtx;
}

#入队操作

void _QueueEnqueue(struct Queue *que, DataType dt, int isFrontOrRear) {
struct QueueNode *vtx=QueueCreatNode(dt);
if(que->size==0){
que->head=que->tail=vtx;
else{
if(isFrontOrRear){
vtx->next=que->head;
que->head->prev=vtx;
que->head=vtx;
}else{
que->tail->next = vtx;             
vtx->prev = que->tail;
que->tail = vtx;                   
}
}
}
++que->size;
}

#出队操作

void _QueueDequeue(struct Queue *que, struct QueueNode *temp, int isFrontOrRear) {
if(que->size == 1) {
que->head = que->tail = NULL;     
}else {
if(isFrontOrRear) {               
que->head = temp->next;        
que->head->prev = NULL;
}else {
que->tail = temp->prev;       
que->tail->next = NULL;
}        
}
free(temp);                           
--que->size;                           
}

#只读接口包含:获取队首元素、获取队尾元素、获取队列大小、队列的判空

DataType QueueGetFront(struct Queue* que) {
return que->head->data;              
}
DataType QueueGetRear(struct Queue* que) {
return que->tail->data;             
}
int QueueGetSize(struct Queue* que) {
return que->size;                    
}
int QueueIsEmpty(struct Queue* que) {
return !QueueGetSize(que);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值