数组实现队列
1、实现原理
通过操作数组的下标来实现队列结构。
栈数组结构体定义:
const int queue_size = 10;
template<class T>
class Queue
{
public:
std::array<T, queue_size> m_que{}; // 队列
int m_fornt{ -1 }; // 头标识
int m_fear{ -1 }; // 尾标识
}
(1)、入队实操说明
- 插入元素(1)
/*
队列数组arr
--------------------------------------------------------------
| 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|-1 |-1
m_fornt m_fear
||
|| m_fornt = m_fear = 0
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |0
m_fornt m_fear
*/
- 插入元素(2)
/*
队列数组arr
--------------------------------------------------------------
| 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |0
m_fornt m_fear
||
|| m_fear++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |1
m_fornt m_fear
*/
- 插入元素(3)
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |1
m_fornt m_fear
||
|| m_fear++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |2
m_fornt m_fear
*/
- 插入元素(4)
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |2
m_fornt m_fear
||
|| m_fear++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |3
m_fornt m_fear
*/
(2)、出队实操说明
- 移除首元素(1)
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |3
m_fornt m_fear
||
|| m_fornt++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|1 |3
m_fornt m_fear
*/
- 移除首元素(2)
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|1 |3
m_fornt m_fear
||
|| m_fornt++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|2 |3
m_fornt m_fear
*/
- 移除首元素(3)
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|2 |3
m_fornt m_fear
||
|| m_fornt++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|3 |3
m_fornt m_fear
*/
- 移除首元素(4)
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|3 |3
m_fornt m_fear
||
|| m_fornt = m_fear = -1
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|-1 |-1
m_fornt m_fear
*/
(3)、打印实操说明
遍历从m_fornt位置开始到m_fear位置结束,依次输出数组
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |3
m_fornt m_fear
遍历从m_fornt位置开始到m_fear位置结束,依次输出数组
*/
(4)、整体代码
#include <iostream>
#include <array>
namespace queue_array
{
const int queue_size = 10;
template<class T>
class Queue
{
public:
std::array<T, queue_size> m_que{}; // 队列
int m_fornt{ -1 }; // 头标识
int m_fear{ -1 }; // 尾标识
/**
* @brief 插入
*/
void push(T m_pData)
{
if(m_fear == m_que.size() - 1)
{
std::cout << "queue 已满." << std::endl;
}
else if (m_fornt == -1 && m_fear == -1)
{
m_fornt = m_fear = 0;
m_que.at(m_fear) = m_pData;
}
else if (m_fear < m_que.size())
{
m_fear++;
m_que.at(m_fear) = m_pData;
}
}
/**
* @brief 删除
*/
void pop()
{
if (isEmpty())
{
std::cout << "queue isempty()" << std::endl;
}
if (m_fornt == m_fear)
{
m_fornt = m_fear = -1;
}
else
{
m_fornt++;
}
}
/**
* @brief 打印
*/
void print_queue()
{
if (isEmpty())
{
std::cout << "queue isempty()" << std::endl;
return;
}
for (int i = m_fornt; i < m_fear; ++i)
{
std::cout << m_que[i] << " ";
}
std::cout << std::endl;
}
/**
* @brief 判空
*/
bool isEmpty() { return (m_fornt == -1); }
/**
* @brief 大小
*/
int size() { return (m_fear - m_fornt); }
};
void test_queue_array()
{
queue_array::Queue<int> m_queue;
m_queue.push(1);
/*
队列数组arr
--------------------------------------------------------------
| 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|-1 |-1
m_fornt m_fear
||
|| m_fornt = m_fear = 0
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |0
m_fornt m_fear
*/
m_queue.push(2);
/*
队列数组arr
--------------------------------------------------------------
| 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |0
m_fornt m_fear
||
|| m_fear++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |1
m_fornt m_fear
*/
m_queue.push(3);
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 0 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |1
m_fornt m_fear
||
|| m_fear++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |2
m_fornt m_fear
*/
m_queue.push(4);
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 0 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |2
m_fornt m_fear
||
|| m_fear++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |3
m_fornt m_fear
*/
m_queue.print_queue();
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |3
m_fornt m_fear
遍历从m_fornt位置开始到m_fear位置结束,依次输出数组
*/
cout << "queue.size()=" << m_queue.size() << endl;
m_queue.pop();
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|0 |3
m_fornt m_fear
||
|| m_fornt++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|1 |3
m_fornt m_fear
*/
m_queue.print_queue();
cout << "queue.size()=" << m_queue.size() << endl;
m_queue.pop();
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|1 |3
m_fornt m_fear
||
|| m_fornt++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|2 |3
m_fornt m_fear
*/
m_queue.print_queue();
cout << "queue.size()=" << m_queue.size() << endl;
m_queue.pop();
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|2 |3
m_fornt m_fear
||
|| m_fornt++
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|3 |3
m_fornt m_fear
*/
m_queue.print_queue();
cout << "queue.size()=" << m_queue.size() << endl;
m_queue.pop();
/*
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|3 |3
m_fornt m_fear
||
|| m_fornt = m_fear = -1
\\//
队列数组arr
--------------------------------------------------------------
| 1 | 2 | 3 | 4 | 0 | 0 | ... | 0 |
--------------------------------------------------------------
|-1 |-1
m_fornt m_fear
*/
m_queue.print_queue();
cout << "queue.size()=" << m_queue.size() << endl;
m_queue.pop();
m_queue.print_queue();
cout << "queue.size()=" << m_queue.size() << endl;
}
}// namespace queue_array
int main()
{
queue_array::test_queue_array();
return 0;
}