C++ deque/queue/stack的底层原理
发布人:shili8
发布时间:2025-01-24 17:55
阅读次数:0
**C++ deque、queue 和 stack 的底层原理**
在 C++ 中,deque(双端队列)、queue(队列)和 stack(堆栈)都是常用的线性数据结构。它们都支持元素的插入和删除操作,但它们的实现细节却有所不同。在本文中,我们将探讨这些数据结构的底层原理,并提供相关代码示例。
###1. deque 的底层原理deque(双端队列)是 C++ 中一种特殊的线性数据结构,它支持从两端插入和删除元素。deque 的底层实现基于一个动态数组和两个指针:`front_` 和 `back_`。
cpptemplate <typename T> class deque { public: // ... private: T* data_; // 动态数组,存储元素 size_t front_; // 前端指针 size_t back_; // 后端指针 void init(size_t n) { // 初始化动态数组和指针 data_ = new T[n]; front_ =0; back_ =0; } ~deque() { delete[] data_; } // 析构函数,释放动态数组 void push_front(const T& x) { // 从前端插入元素 if (front_ ==0) { init(1); } size_t newFront = front_; --newFront; data_[newFront] = x; front_ = newFront; } void push_back(const T& x) { // 从后端插入元素 if (back_ == capacity()) { init(capacity() *2); } size_t newBack = back_; ++newBack; data_[newBack] = x; back_ = newBack; } T pop_front() { // 从前端删除元素 if (front_ == back_) { delete[] data_; front_ =0; back_ =0; } size_t oldFront = front_; ++oldFront; T x = data_[oldFront]; front_ = oldFront; return x; } T pop_back() { // 从后端删除元素 if (front_ == back_) { delete[] data_; front_ =0; back_ =0; } size_t oldBack = back_; --oldBack; T x = data_[oldBack]; back_ = oldBack; return x; } // ... };
在上面的代码中,我们可以看到 deque 的底层实现基于一个动态数组和两个指针:`front_` 和 `back_`。当从前端插入元素时,会将新元素放置在当前的 `front_` 指向的位置之前;当从后端插入元素时,会将新元素放置在当前的 `back_` 指向的位置之后。当从前端或后端删除元素时,会将 `front_` 或 `back_` 指针移动到下一个位置。
###2. queue 的底层原理queue(队列)是 C++ 中一种特殊的线性数据结构,它支持从一端插入和删除元素。queue 的底层实现基于一个动态数组和两个指针:`front_` 和 `back_`。
cpptemplate <typename T> class queue { public: // ... private: T* data_; // 动态数组,存储元素 size_t front_; // 前端指针 size_t back_; // 后端指针 void init(size_t n) { // 初始化动态数组和指针 data_ = new T[n]; front_ =0; back_ =0; } ~queue() { delete[] data_; } // 析构函数,释放动态数组 void push(const T& x) { // 从后端插入元素 if (back_ == capacity()) { init(capacity() *2); } size_t newBack = back_; ++newBack; data_[newBack] = x; back_ = newBack; } T pop() { // 从前端删除元素 if (front_ == back_) { delete[] data_; front_ =0; back_ =0; } size_t oldFront = front_; ++oldFront; T x = data_[oldFront]; front_ = oldFront; return x; } // ... };
在上面的代码中,我们可以看到 queue 的底层实现基于一个动态数组和两个指针:`front_` 和 `back_`。当从后端插入元素时,会将新元素放置在当前的 `back_` 指向的位置之后。当从前端删除元素时,会将 `front_` 指针移动到下一个位置。
###3. stack 的底层原理stack(堆栈)是 C++ 中一种特殊的线性数据结构,它支持从一端插入和删除元素。stack 的底层实现基于一个动态数组和一个指针:`top_`。
cpptemplate <typename T> class stack { public: // ... private: T* data_; // 动态数组,存储元素 size_t top_; // 顶部指针 void init(size_t n) { // 初始化动态数组和指针 data_ = new T[n]; top_ =0; } ~stack() { delete[] data_; } // 析构函数,释放动态数组 void push(const T& x) { // 从顶部插入元素 if (top_ == capacity()) { init(capacity() *2); } size_t newTop = top_; ++newTop; data_[newTop] = x; top_ = newTop; } T pop() { // 从顶部删除元素 if (top_ ==0) { delete[] data_; top_ =0; } size_t oldTop = top_; --oldTop; T x = data_[oldTop]; top_ = oldTop; return x; } // ... };
在上面的代码中,我们可以看到 stack 的底层实现基于一个动态数组和一个指针:`top_`。当从顶部插入元素时,会将新元素放置在当前的 `top_` 指向的位置之后。当从顶部删除元素时,会将 `top_` 指针移动到上一个位置。
综上所述,我们可以看到 deque、queue 和 stack 的底层原理都是基于动态数组和指针实现的。它们都支持元素的插入和删除操作,但它们的实现细节却有所不同。在实际应用中,选择合适的数据结构是非常重要的。