队列-链式结构-C++实现

        教科书告诉我们所先进先出的结构叫做队列,没错,就是队列,正如排队一样了,出队永远在队头,入队永远在队尾,我们要频繁对这两个点进行操作,那么应该选择什么样的结构来实现呢?数组,特点:实现简单,容量有限,删除一次要进行一定数量元素的移动,所有效率有待提高。当然可以循环使用数组空间来避免移动元素带来的开销,但是呢,还是不如链式结构来得直观。

        本文使用一个双向链表来实现队列,用两个固定的指针标记链表的起点和终点,即队列的头部和尾部,并且插入和删除的操作实现起来也比较愉快。代码中我们封装一个queue类。上代码:

#include <iostream>
using namespace std;

struct NODE//双向链表基本单元结构
{
    int data;
    NODE *next;//后继指针
    NODE *pre;//前驱指针
};

class QUEUE//定义queue类封装数据和实现
{
private:
    NODE *front;//队头指针
    NODE *tail;//队尾指针
    unsigned size;

public:
    QUEUE();
    ~QUEUE(){};
    void initialize();//初始化
    void enqueue(int n);//入队
    void dequeue();//出队
    int get_front();//获取元素
    void clear();//清空队列
    int get_size();//返回元素个数
    bool isempty();//判断是否为空
    void display_queue();//输出队列
};

QUEUE::QUEUE()
{
    initialize();
}

void QUEUE::initialize()
{
    //初始化头部和尾部指针
    front = new NODE();
    tail = new NODE();
    //将头尾连接
    front->data = tail->data = 0;
    front->pre = tail->next = NULL;
    front->next = tail;
    tail->pre = front;
    size = 0;//设置元素个数为0
}

void QUEUE::enqueue(int n)
{
    //开辟新节点
    NODE *new_ele = new NODE();
    //设置数据
    new_ele->data = n;
    //将新节点插入到双向链表尾部
    tail->pre->next = new_ele;
    new_ele->next = tail;
    new_ele->pre = tail->pre;
    tail->pre = new_ele;

    size++;//元素个数加1
}

void QUEUE::dequeue()
{
    if (isempty())//避开对空队列的操作
    {
        cout << "queue is empty" << endl;
        return;
    }
    //获取删除将要删除的元素指针
    NODE *temp = front->next;
    front->next = temp->next;
    temp->next->pre = front;
    delete(temp);//释放内存
    size--;
}   

int QUEUE::get_front()
{
    if (front->next != tail)
        return front->next->data;
    else
        cout << "empty queque" << endl;
    return -1;
}

void QUEUE::clear()
{
    NODE *temp = front;
    //遍历链表释放所有节点内存
    while(temp != tail)
    {
        NODE *del_data = temp;
        temp = temp->next;
        delete(del_data);
    }
    //调用函数重新初始化
    initialize();
}

int QUEUE::get_size()
{
    return size;
}

void QUEUE::display_queue()
{
    NODE *temp = front->next;
    while (temp != tail)
    {
        cout << temp->data << " ";
        temp = temp->next;
    }
    if (isempty())
        cout << "queue is empty" << endl;
    else
        cout << endl;
}

bool QUEUE::isempty()
{
    return front->next == tail;
}

int main(int argc, char const *argv[])
{
    QUEUE que;
    /*
     *do somthing here
     */
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值