Dequeuer.h
#ifndef _DEQUE_H__
#define _DEQUE_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int T;
typedef struct Deque{
T *m_vect; //存储元素的内存空间
size_t cap; //总容量
size_t size; //当前元素的个数
size_t index; //队首的位置
}Deque;
void init(Deque *deq,size_t cap);
void destroy(Deque *deq);
bool isEmpty(Deque *deq);
bool isFull(Deque *deq);
size_t getCap(Deque *deq);
size_t getSize(Deque *deq);
void pushHead(Deque *deq,T data);
void pushTail(Deque *deq,T data);
T popHead(Deque *deq);
T popTail(Deque *deq);
T peekHead(Deque *deq);
T peekTail(Deque *deq);
void travel(Deque *deq);
void clear(Deque *deq);
#endif //_DEQUE_H__
Dequeuer.c
#include "deque.h"
/*
typedef int T;
typedef struct Deque{
T *m_vect; //存储元素的内存空间
size_t cap; //总容量
size_t size; //当前元素的个数
size_t index; //队首的位置
}Deque;
*/
void init(Deque *deq,size_t cap){
deq->m_vect = calloc(cap,sizeof(T));
deq->cap = cap;
deq->size = 0;
deq->index = 0;
}
void destroy(Deque *deq){
if(deq->m_vect != NULL){
free(deq->m_vect);
deq->m_vect = NULL;
}
}
bool isEmpty(Deque *deq){
return deq->size == 0;
}
bool isFull(Deque *deq){
return deq->cap == deq->size;
}
size_t getCap(Deque *deq){
return deq->cap;
}
size_t getSize(Deque *deq){
return deq->size;
}
void pushHead(Deque *deq,T data){
/*
if(deq->index==0){
deq->index = deq->cap-1;
}else{
--deq->index;
}*/
deq->index = deq->index==0?deq->cap-1:deq->index-1;
deq->m_vect[deq->index] = data;
++deq->size;
}
void pushTail(Deque *deq,T data){
deq->m_vect[(deq->size+deq->index)%deq->cap] = data;
++deq->size;
}
T popHead(Deque *deq){
T data = deq->m_vect[deq->index];
deq->index = (deq->index+1)%deq->cap;
--deq->size;
return data;
}
T popTail(Deque *deq){
T data = deq->m_vect[(deq->size+deq->index-1)%deq->cap];
--deq->size;
return data;//return deq->m_vect[(--deq->size+deq->index)%deq->cap];
}
T peekHead(Deque *deq){
return deq->m_vect[deq->index];
}
T peekTail(Deque *deq){
return deq->m_vect[(deq->index+deq->size-1)%deq->cap];
}
void travel(Deque *deq){
for(int i=0;i<deq->size;i++){
printf("%d ",deq->m_vect[(deq->index+i)%deq->cap]);
}
printf("\n");
}
void clear(Deque *deq){
while(!isEmpty(deq)){
popTail(deq);
}
//deq->size = 0;
//deq->index = 0;
}
Test.c
#include "deque.h"
int main(){
Deque deq;
init(&deq,6);
pushHead(&deq,10);
pushTail(&deq,20);
pushHead(&deq,30);
pushTail(&deq,40);
pushHead(&deq,50);
pushTail(&deq,60);
//50 30 10 20 40 60
while(!isEmpty(&deq)){
//printf("%d ",popHead(&deq));
printf("%d ",popTail(&deq));
}
printf("\n");
destroy(&deq);
return 0;
}
本文详细介绍了一种高效的数据结构——双端队列(Deque)的C语言实现。包括初始化、销毁、判断空满状态、获取容量和大小、头部尾部插入删除元素等操作,并通过一个简单的测试案例展示了其使用方法。

被折叠的 条评论
为什么被折叠?



