程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++雙向鏈表構成的隊列

c++雙向鏈表構成的隊列

編輯:關於C++

c++雙向鏈表構成的隊列:也可以看成循環隊列的。需要仔細,重點是插入與彈出,結合前篇的繪圖,總結邏輯是:1先外部元素建立連接,2後內部元素改變連接。

3改變內部元素連接時,留意前驅或後驅是否為空時的特例。
以下是自定義實現:

//circularqueue.h

#ifdef _MSC_VER
#pragma once
#endif // _MSC_VER

#ifndef CIRCULAR_QUEUE_h_H_
#define CIRCULAR_QUEUE_h_H_

#include
#include

/** 此容器保存的數據類型 */
typedef int DataType;

/** 結點類型 */
struct Node
{
    DataType data_;
    Node* next_;
    Node* prev_;
};

class CircularQueue
{
    Node* pFront;       ///< 指向頭結點
    Node* pBack;        ///< 指向尾結點
    int maxSize_;       ///< 最大可用容量
    int size_;          ///< 已使用的容量
public:
    /** 構造函數,傳入最大容量參數 */
    explicit CircularQueue(int maxSize);
    ~CircularQueue();

    /** 從尾部插入 */
    int push_back(DataType data);

    /** 從頭部彈出 */
    int pop_front();

    /** 返回頭結點的數據 */
    DataType front();

    /** 已使用的容量 */
    int size();

    /** 空隊判斷 */
    bool empty();

    /** 滿隊判斷 */
    bool full();
};

#endif // !CIRCULAR_QUEUE_h_H_

//circularqueue.cpp

#include "circularqueue.h"

CircularQueue::CircularQueue(int maxSize)
{
    assert(maxSize > 0);
    pFront=NULL;
    pBack=NULL;
    maxSize_ = maxSize;
    size_ = 0;
}

CircularQueue::~CircularQueue()
{
    Node* tempNode;
    while (pFront !=NULL)
    {
        tempNode = pFront->next_;
        delete pFront;
        pFront = tempNode;
    }
}

int CircularQueue::push_back(DataType data)
{
    assert(!full());

    Node* newNode = new Node;
    newNode->data_ = data;
    if (empty())
    {
        // 構造隊列
        newNode->next_ = NULL;
        newNode->prev_ = NULL;
        pBack=pFront = newNode;

    }
    else
    {
        // 隊尾插入
        newNode->prev_ = pBack;
        newNode->next_ = pBack->next_;
        pBack->next_ = newNode;
        pBack = newNode;
    }
    size_++;

    return 0;
}

int CircularQueue::pop_front()
{
    assert(!empty());
    Node* tempNode = pFront;

    if (pFront->next_!=NULL)
    {
        pFront->next_->prev_ = pFront->prev_;
    }
    pFront = pFront->next_;
    delete tempNode;
    size_--;

    return 0;
}

DataType CircularQueue::front()
{
    assert(!empty());
    return pFront->data_;
}

int CircularQueue::size()
{
    return size_;
}

bool CircularQueue::empty()
{
    return size_==0;
}

bool CircularQueue::full()
{
    return size_ == maxSize_;
}

//test.cpp

#include
#include"vector.h"

using std::cout;
using std::endl;


int main()
{
    std::cout << "hello" << std::endl;
    CircularQueue queue(3);
    queue.push_back(1);
    queue.push_back(2);
    queue.push_back(3);
    cout << queue.front() << "-" << queue.size() << endl;
    queue.pop_front();
    cout << queue.front() << "-" << queue.size() << endl;
    queue.pop_front();
    cout << queue.front() << "-" << queue.size() << endl;

    queue.pop_front();
    queue.push_back(4);
    queue.push_back(5);
    queue.push_back(6);
    cout << queue.front() << "-" << queue.size() << endl;

    queue.pop_front();
    cout << queue.front() << "-" << queue.size() << endl;
    queue.pop_front();
    cout << queue.front() << "-" << queue.size() << endl;
    queue.pop_front();
    cout << "-" << queue.size() << endl;

    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved