问题描述:
面试或笔试时,常常会遇到自主实现一个队列,以实现队列的进出,判空和满等的相关操作,虽然实现难度较为简单,但却也算得上一个热门题型,主要考察学生有效时间内对于简单队列的设计是否考虑周全以及成员函数的实现以及参数和函数返回值等细节问题。
#include<iostream>
using namespace std;
template <class T>
struct Node
{
T _data;//值域
Node <T> *_next;//指针域
Node(const T &data = 0)
{
_data = data;
_next = NULL;
}
};
template <class T>
class Queue
{
protected:
Node<T> *_head;//队首指针
Node <T>*_tail;//队尾指针
public:
Queue()
:_head(NULL)
, _tail(NULL)
{}
~Queue()
{
Node<T> *ret = NULL;
if (_head == NULL)
return;
if (_head == _tail)
{
delete _head;
_head = NULL;
_tail = _head;
}
else
{
while (_head)
{
pop();
}
}
}
void push(const T&x)//入队
{
Node<T> *newNode = new Node<T>(x);
if (_tail == NULL)
{
_tail = newNode;
_head = _tail;
}
else
{
_tail->_next = newNode;
_tail = newNode;
}
}
void pop()//出队
{
Node<T>*ret = NULL;
if (_head == NULL)
return;
if (_head == _tail)
{
delete _head;
_head = NULL;
_tail = _head;
}
else
{
ret = _head;
_head = _head->_next;
delete ret;
}
}
T &Front()//队列的特性,先进先出
{
Node <T>*ret = _head;
_head = _head->_next;
return ret->_data;
}
T &Back()
{
Node <T>*ret = _tail;
_tail = _head->_tail;
return _tail->_data;
}
bool Empty()//判空
{
return _head == _tail;
}
void show()//打印队列
{
while (_head)
{
cout << _head->_data << " ";
_head = _head->_next;
}
}
};
void Test()
{
Queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.pop();
q.show();
getchar();
}
int main()
{
Test();
return 0;
}
注:自主实现简单的队列,有助于深入理解队列的构造以及特性,也是进一步学习相关队列的复杂操作的重要基础,在自主实现后使用库函数的队列才更加得心应手。