数据结构与算法学习笔记——队列ADT C++实现

数据结构与算法学习笔记——队列ADT C++实现


1 特点

队列的数据结构为线性结构

队列只能在一端完成插入,在另一端完成删除。先进先出(FIFO),生活中的例子有买票排队、打印机的打印队列

2 包含的操作

  • 入队列
  • 出队列

3 实现方式

基于数组实现

4 队列与循环队列

4.1 队列

编程时主要考虑的是指针移动操作和数据操作的顺序,以及空间是否为满/空(相应的,不能入/出队列)

存在的缺点是空间越用越少

MyQueue.h

#include <iostream>
const int N = 10;   // 数组大小

template <typename T>
class MyQueue
{
public:
    MyQueue();
    ~MyQueue();     
    void enqueue(T);   
    T dequeue();  
    void show_array();      
private:
    int _front;       
    int _back;  
    T _array[N] = {0};     // 数据存放在数组中
    bool _isEmpty();     
    bool _isFull(); 
protected:
};

MyQueue.cpp

#include "MyQueue.h"

/*
 * 将表头和尾部初始化为0
 */
template <typename T>
MyQueue<T>::MyQueue()
{
    _front = _back = 0;
}
/*
 * 析构函数
 */
template <typename T>
MyQueue<T>::~MyQueue()
{

}
/*
 * 判断队列是否为空
 */ 
template <typename T>
bool MyQueue<T>::_isEmpty()
{
    if(_back == _front)
        return true;
    else if(_back > _front)
        return false;
    else
    {
        std::cout << "someting wrong with the space" << std::endl;
        return true;
    }
}
/*
 * 判断队列是否为满
 */ 
template <typename T>
bool MyQueue<T>::_isFull()
{
    if(_back == N)
        return true;
    else if(_back < N)
        return false;
    else
    {
        std::cout << "someting wrong with the space" << std::endl;
        return true;
    }
}
/*
 * 入队列
 */ 
template <typename T>
void MyQueue<T>::enqueue(T data)
{
    if(_isFull())
        std::cout << "the space is full, failed to enquence" << std::endl;
    else
        _array[_back++] = data;
}
/*
 * 出队列
 */ 
template <typename T>
T MyQueue<T>::dequeue()
{
    if(_isEmpty())
    {
        std::cout << "the space is empty, failed to dequence" << std::endl;
        return -999;
    }
    else
        return _array[_front++];
}
/*
 * 测试程序,显示数组信息
 */ 
template <typename T>
void MyQueue<T>::show_array()
{
    std::cout << "the elements are: ";
    for(int i = 0; i < N; i++)
    {
        std::cout << _array[i] << '\t';
    }
    std::cout << std::endl
              << "the variable _front is: " << _front << std::endl
              << "the variable _back is: " << _back << std::endl;
}

template class MyQueue<int>;
template class MyQueue<float>;
template class MyQueue<double>;

main.cpp

#include <iostream>
#include "MyQueue.h"

int main()
{
    MyQueue<int> queue1;
    int num;    
    for(int i = 0; i < N + 1; i++)
    {
        std::cout << "enquence a integrate number:" << std::endl;
        std::cin >> num;
        queue1.enqueue(num); 
    }
    for(int i = 0; i < N + 1; i++)
        std::cout << "dequence a number, the number is: " << queue1.dequeue() << std::endl;
    queue1.show_array();
    return 0;
}

运行结果:
这里把入队列和出队列的英文写错了,抱歉
在这里插入图片描述

4.2 循环队列

解决了上述队列空间越用越少的问题

front==back时作为队列为空处理,这样的话size=(back-front+N)%N == N-1时,队列就被认为是满的,但是此时元素array[back]的空间未被使用,也就是说大小为N的数组最多存放N-1个元素

MyQueue.h

#include <iostream>
const int N = 10;   // 数组大小

template <typename T>
class MyQueue
{
public:
    MyQueue();
    ~MyQueue();      
    bool isEmpty();     
    bool isFull();  
    void enqueue(T);   
    T dequeue();        
    void show_array();
private:
    int _front;       
    int _back; 
    T _array[N] = {0};     // 数据存放在数组中
protected:
};

MyQueue.cpp

#include "MyQueue.h"

/*
 * 将表头和尾部初始化为0
 */
template <typename T>
MyQueue<T>::MyQueue()
{
    _front = _back = 0;
}
/*
 * 析构函数
 */
template <typename T>
MyQueue<T>::~MyQueue()
{

}
/*
 * 判断队列是否为空
 */ 
template <typename T>
bool MyQueue<T>::isEmpty()
{
    if((_back-_front+N)%N == 0)
        return true;
    else
        return false;
}
/*
 * 判断队列是否为满
 * 如果_back==N-1,_front==0,则判断为满
 * 虽然此时还有一个空间,但是不能再入队列,否则不能区分该队列是满还是空
 */ 
template <typename T>
bool MyQueue<T>::isFull()
{
    if((_back-_front+N)%N == N-1)  
        return true;
    else
        return false;
}
/*
 * 入队列
 */ 
template <typename T>
void MyQueue<T>::enqueue(T data)
{
    if(isFull())
    {
       std::cout << "the space is full, failed to enquence" << std::endl;
    }
    else
    {
        if(_back == N)
            _back = 0;
        _array[_back++] = data;
    }    
}
/*
 * 出队列
 */ 
template <typename T>
T MyQueue<T>::dequeue()
{
    if(isEmpty())
    {
        std::cout << "the space is empty, failed to dequence" << std::endl;
        return -999;
    }
    else
    {
        if(_front == N)
            _front = 0;
        return _array[_front++];
    }   
}
/*
 * 测试程序,显示数组信息
 */ 
template <typename T>
void MyQueue<T>::show_array()
{
    std::cout << "the elements are: ";
    for(int i = 0; i < N; i++)
    {
        std::cout << _array[i] << '\t';
    }
    std::cout << std::endl
              << "the variable front is: " << _front << std::endl
              << "the variable back is: " << _back << std::endl;
}

template class MyQueue<int>;
template class MyQueue<float>;
template class MyQueue<double>;

main.cpp

#include <iostream>
#include "MyQueue.h"

int main()
{
    MyQueue<int> queue1;
    int num;    
    for(int i = 0; i < N; i++)      // 当front==0,back==N-2时,队列满,不能再入队列
    {
        std::cout << "enquence a integrate number:" << std::endl;
        std::cin >> num;
        queue1.enqueue(num); 
    }
    for(int i = 0; i < N ; i++)     // front==back时,队列空,不能再出队列
        std::cout << "dequence a number, the number is: " << queue1.dequeue() << std::endl;
    queue1.show_array();
    MyQueue<int> queue2;
    for(int i = 0; i < N - 1; i++)  
    {
        std::cout << "enquence a integrate number:" << std::endl;
        std::cin >> num;
        queue2.enqueue(num); 
    }
    std::cout << "dequence a number, the number is: " << queue2.dequeue() << std::endl;   // 此时队列满,不能再入队列
    std::cout << "enquence a integrate number:" << std::endl;       
    std::cout << "dequence a number, the number is: " << queue2.dequeue() << std::endl;   
    std::cout << "enquence a integrate number:" << std::endl;  
    std::cout << "dequence a number, the number is: " << queue2.dequeue() << std::endl;   
    std::cout << "enquence a integrate number:" << std::endl;      
    std::cin >> num;
    queue2.enqueue(num);      // 此时可以再入队列
    std::cout << "enquence a integrate number:" << std::endl;       
    std::cin >> num;
    queue2.enqueue(num);          
    std::cout << "enquence a integrate number:" << std::endl;       
    std::cin >> num;
    queue2.enqueue(num);            
    queue2.show_array();         
    return 0;
}

运行结果:
这里入队列和出队列的英文写错了,抱歉
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值