数据结构之 队列 手写 Deque_Link

本文详述了在学习数据结构过程中,如何手动实现一个双端队列(Deque)链接结构,探讨其核心操作和逻辑。
摘要由CSDN通过智能技术生成

记录数据结构队列学习过程(手写deque)

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

template <typename T> struct DequeNode {
   
    T data;
    DequeNode* prev;
    DequeNode* next;

    DequeNode() {
   };
    DequeNode(T e, DequeNode p = NULL, DequeNode q = NULL) :data(e), prev(p), next(q) {
   }//默认构造(方便赋值)
};

template <typename T> class Deque_Link {
   
private:
    DequeNode<T>* head;
    DequeNode<T>* tail;
    int _size;
    void Init();

public:
    Deque_Link() {
    Init(); };
    ~Deque_Link();

    T& operator [] (int ) const;                //重载[]运算符
    int size()const {
    return _size; };          //返回大小
    bool empty()const {
    return _size <= 0; };   //判断是否为空
    void push_back(const T&);
    void push_front(const T&);
    void pop_front();
    void pop_back();
    void clear();
    T erase(DequeNode<T>* p);                   
下面是使用数组实现双头队列的代码示例: ``` #include <stdio.h> #include <stdlib.h> #define Type int // 定义元素类型 typedef struct Deque{ Type *array; // 数组 int ihead; // 头索引 int itail; // 尾索引 int entry_count; // 现存数据数量 int array_capacity; // 容量大小 }Deque, *Deque_link; // 初始化双头队列 void init_deque(Deque_link deque, int capacity) { deque->array = (Type*)malloc(sizeof(Type) * capacity); deque->ihead = 0; deque->itail = capacity - 1; deque->entry_count = 0; deque->array_capacity = capacity; } // 判断队列是否为空 int is_empty(Deque_link deque) { return deque->entry_count == 0; } // 判断队列是否已满 int is_full(Deque_link deque) { return deque->entry_count == deque->array_capacity; } // 获取队列长度 int size(Deque_link deque) { return deque->entry_count; } // 从队头入队 void push_front(Deque_link deque, Type value) { if (is_full(deque)) { printf("Deque is full, cannot push_front!\n"); return; } deque->array[deque->ihead] = value; deque->ihead = (deque->ihead + 1) % deque->array_capacity; deque->entry_count++; } // 从队尾入队 void push_back(Deque_link deque, Type value) { if (is_full(deque)) { printf("Deque is full, cannot push_back!\n"); return; } deque->array[deque->itail] = value; deque->itail = (deque->itail - 1 + deque->array_capacity) % deque->array_capacity; deque->entry_count++; } // 从队头出队 Type pop_front(Deque_link deque) { if (is_empty(deque)) { printf("Deque is empty, cannot pop_front!\n"); return -1; } Type value = deque->array[(deque->ihead - 1 + deque->array_capacity) % deque->array_capacity]; deque->ihead = (deque->ihead - 1 + deque->array_capacity) % deque->array_capacity; deque->entry_count--; return value; } // 从队尾出队 Type pop_back(Deque_link deque) { if (is_empty(deque)) { printf("Deque is empty, cannot pop_back!\n"); return -1; } Type value = deque->array[(deque->itail + 1) % deque->array_capacity]; deque->itail = (deque->itail + 1) % deque->array_capacity; deque->entry_count--; return value; } int main() { Deque deque; int capacity = 10; init_deque(&deque, capacity); // 从队头入队 for (int i = 0; i < 5; i++) { push_front(&deque, i); } // 从队尾入队 for (int i = 5; i < 10; i++) { push_back(&deque, i); } // 从队头出队 while (!is_empty(&deque)) { printf("%d ", pop_front(&deque)); } printf("\n"); // 从队尾出队 for (int i = 0; i < 5; i++) { push_front(&deque, i); } while (!is_empty(&deque)) { printf("%d ", pop_back(&deque)); } printf("\n"); return 0; } ``` 在上面的代码中,我们使用了一个数组来存储双头队列中的元素。`ihead` 表示队头的位置,`itail` 表示队尾的位置,`entry_count` 表示队列中现存的元素数量,`array_capacity` 表示数组的容量大小。在初始化双头队列时,我们先动态分配一个数组,并将队头和队尾的位置分别初始化为 0 和 `capacity - 1`。当队列满时,我们无法继续插入元素,当队列为空时,我们无法出队元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值