码迷,mamicode.com
首页 > 编程语言 > 详细

队列 - 数据结构C++实现

时间:2016-08-23 16:46:01      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:

参考链接:数据结构探险—队列篇

数据结构太重要了,不学好是没法进行软件开发的。

从零开始,学习数据结构。

队列


队列的模型

想象一下现实生活中的队列,排队先入先出,不允许插队,队头先出,队尾进入。

队列的编程实现方式

环形队列,数组实现,静态的,事先确定队列容量,人为取余,循环利用数组资源。

普通队列,链表实现,动态的,有点浪费,因为插入删除只在队列头尾进行。

队列的基本元素

要操纵队列,必须要有一个数组(指针),队列长度,容量;然后用队列头和队列尾操纵队列。

队列头和队列尾到底意味着什么?

队列的基本操作

创建队列,销毁队列,清空队列,队列判空,队列判满,队列长度;元素入队,元素出对,遍历队列

基本操作的实现

创建队列:构造函数实现,函数参数为队列容量;此步需要完成的任务:形成数组实体,即分配内存,将一些队列基本元素初始化。

销毁队列:析构函数实现,释放内存,指针置空。

清空队列:指针不动,基本元素初始化

队列判空:通过长度判断

队列判满:通过长度和容量判断

队列长度:直接返回

元素入队:判断能否插入,能则插入,更新队列基本信息(技巧)

元素出对:判断是否有东西可以删除,更新队列基本信息

遍历队列:循环,从头到尾,遍历(输出)

大部分的操作都是针对队列基本元素的,会利用和改变它。

写一个大型的数据结构很难,很容易就会出现某些细小的错误,如果无法控制这些细小的错误,那等程序大起来之后,就很难很难找错和调试了。

 

C++实现步骤

  • 首先,把上面的流程走一遍,做到心中有数。
  • 写出队列的接口(建议写在一个单独文档里,以便随时查阅),先不谈具体实现;(照着抄很容易,关键要会默写)
  • 实现,核心功能,创建,插入,删除,遍历显示,调试成功
  • 补充其他核心功能

 

代码要写好,还真是太难了,首先要正确的命名,其次大小写还不能搞错,在使用的时候还要一一对应。

函数的返回值、函数名、参数等等,都不允许有错误。(很难一次性写好,在实现时慢慢修正)

初次亲手敲代码的体会:队列的代码量确实很少,接口20多行;实现80多行,测试20多行,根本就不算多;但是写起来还是感觉很难,之前敲书本上的单个例题,感觉还没什么难度;队列元素太多,基本的5个元素,操作太多,9个基本操作,操作之间部分依赖;我对C++的语法也不算太熟悉,有些卡顿;东西太多,太杂,名称太长,导致我眼花缭乱。

 

标准C++代码

#pragma once
//MyQueue.h
//环形队列C++实现
class MyQueue
{
public:
    MyQueue(int queueCapacity);        //InitQueue(&Q)创建队列
    virtual ~MyQueue();                //DestroyQueue(&Q)销毁队列
    void ClearQueue();                //ClearQueue(&Q)清空队列
    bool QueueEmpty() const;        //QueueEmpty(&Q)判空队列
    int QueueLength() const;        //QueueLength(Q)队列长度
    bool QueueFull() const;

    bool EnQueue(int element);        //EnQueue(&Q, element)新元素入队
    bool DeQueue(int &element);        //DeQueue(&Q, &element)首元素出队
    void QueueTraverse();            //QueueTraverse(Q, visit())遍历队列
private:
    int *m_pQueue;                    //队列数组数组
    int m_iQueueLen;                //队列元素个数
    int m_iQueueCapacity;            //队列数组容量

    int m_iHead;
    int m_iTail;
};
//MyQueue.cpp
#include"MyQueue.h"
#include<iostream>
using namespace std;

MyQueue::MyQueue(int queueCapacity)
{
    m_iQueueCapacity = queueCapacity;
    m_iHead = 0;
    m_iTail = 0;
    m_iQueueLen = 0;
    m_pQueue = new int[m_iQueueCapacity];
}

MyQueue::~MyQueue()
{
    delete[]m_pQueue;
    m_pQueue = nullptr;
}

void MyQueue::ClearQueue()
{
    m_iHead = 0;
    m_iTail = 0;
    m_iQueueLen = 0;
}

bool MyQueue::QueueEmpty() const
{
    if (m_iQueueLen == 0)
        return true;
    else
        return false;
}

bool MyQueue::QueueFull() const
{
    if (m_iQueueLen == m_iQueueCapacity)
        return true;
    else
        return false;
}

int MyQueue::QueueLength() const
{
    return m_iQueueLen;
}

bool MyQueue::EnQueue(int element)
{
    if (QueueFull())
        return false;
    else
    {
        m_pQueue[m_iTail] = element;
        m_iTail++;
        m_iTail = m_iTail % m_iQueueCapacity;
        m_iQueueLen++;
        return true;
    }
}

bool MyQueue::DeQueue(int &element)
{
    if (QueueEmpty())
        return false;
    else
    {
        element = m_pQueue[m_iHead];
        m_iHead++;
        m_iHead = m_iHead % m_iQueueCapacity;
        m_iQueueLen--;
        return true;
    }
}

void MyQueue::QueueTraverse()
{
    for (int i = m_iHead; i < m_iQueueLen + m_iHead; i++)
    {
        cout << m_pQueue[i%m_iQueueCapacity] << endl;
    }
}
//demo.cpp
#include<iostream>
#include"MyQueue.h"
using namespace std;

int main()
{
    MyQueue *p = new MyQueue(4);
    p->EnQueue(1);
    p->EnQueue(0);
    p->EnQueue(11);
    p->QueueTraverse();
    p->ClearQueue();
    cout << "after clear: " << endl;
    p->QueueTraverse();
    if (p->QueueEmpty())
        cout << "Empty queue" << endl;
    else
        cout << "Not Empty" << endl;
    p->EnQueue(5);
    p->EnQueue(15);
    p->EnQueue(25);
    cout << p->QueueLength() << endl;
    int tmp;
    p->DeQueue(tmp);
    cout << "tmp is " << tmp << endl;
    cout << p->QueueLength() << endl;
    return 0;
}

队列 - 数据结构C++实现

标签:

原文地址:http://www.cnblogs.com/leezx/p/5799668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!