我们知道,队列是使用的最常见的数据结构之一。常用的队列的实现有两种方法,数组和链式结构。下面用数组实现以下queue。包括的实现函数:
enqueue(T x) 压入队列。
getqueue() 获取队列元素,但不取出队列
removequeue() 取出队列元素
searchqueue(T x) 查询元素x
empty() 队列是否为空
length() 返回队列长度
使用c++的template 实现。
class 的声明如下:
const int MAXSIZE = 100;
template < class T > //运用模板类
class queue
{
public:
queue(); //构造一个新的队列
~queue(); //析构函数
int enqueue( T x ); //x元素入队
T getqueue(); //获取队头元素,但不取出
T removequeue(); //取出队头元素
void searchqueue(); //遍历队列中的元素
bool empty(); //判断队列是否为空
int search( T x ); //查找元素x
int length(); //检查队列长度
private:
int front,rear; //队头队尾指针,队头指向队列第一个元素,队尾指向队列中最后一个元素
T data[ MAXSIZE ]; //定义存放队列元素的数组
};
template < class T >
inline queue<T> :: queue() //初始化队列,front 和 rear 均设为0
{
front = rear = 0;
data=new T[MAXSIZE];
count=1;
}
template < class T >
inline queue<T> :: ~queue()
{
}
template < class T >
inline void queue<T> :: enqueue( T x )
{
int Capacity;
if ( rear >= count*MAXSIZE - 1) //判断队列是否已满
{
Capacity=(++count)*MAXSIZE;
T* temp=new T[Capacity];
for(int i=0;i<Capacity-MAXSIZE;++i)
{
temp[i]=data[i];
}
delete [] data;
data=temp;
}
data[rear] = x;
rear = rear + 1;
}
template < class T >
inline T queue<T> :: getqueue()
{
if ( front == rear )
throw "溢出"; //队列为空时抛出“溢出”
return data[front];
}
template < class T >
inline T queue<T> :: removequeue()
{
if ( front == rear )
throw "溢出";
T result =data[front];
front = front + 1;
return result;
}
template < class T >
inline bool queue<T> :: empty() //队列为空时返回值为1,不为空返回值为0
{
if ( front == rear )
return true;
else
return false;
}
template < class T >
inline int queue<T> :: search( T x ) //返回值为在队列中查找到x的次数
{
int i;
int m = 0;
for ( i = front; i < rear; ++i) //从第二个元素开始查找(第一个元素存放的是队列长度),直到查到队尾元素为止
{
if ( x == data[i] )
m = m + 1;
}
return m;
}
template < class T >
inline int queue<T> :: length()
{
return rear-front; //返回队首元素
}
//遍历队列
template < class T >
inline void queue<T> :: searchqueue()
{
int i;
if ( front == rear )
std :: cout << "队列是空的!" << endl;
for ( i = front; i < rear; ++i )
{
std :: cout << data[i] << " ";
}
std :: cout << endl;
}
测试代码:
void main()
{
int x;
queue <int> a;
cout << "向队中添加元素1" << endl;
a.enqueue( 1 );
cout << "向队中添加元素2" << endl;
a.enqueue( 2 );
cout << "向队中添加元素3" << endl;
a.enqueue( 3 );
cout << "向队中添加元素4" << endl;
a.enqueue( 4 );
cout << "向队中添加元素5" << endl;
a.enqueue( 5 );
cout << "向队中添加元素6" << endl;
a.enqueue( 6 );
cout << "显示此时的队首元素:" << a.getqueue() << endl;
cout << "删除此时的队首元素并输出该元素为:" << a.removequeue() <<endl;
cout << "删除此时的队首元素并输出该元素为:" << a.removequeue() <<endl;
cout << "显示此时的队首元素:" << a.getqueue() << endl;
cout << "此时的队列长度为:" << a.length() << endl;
cout << "判断队列是否为空(输出0为空,1不为空):" << a.empty() << endl;
cout << "遍历该队列,依次输出各个元素:" << endl;
a.searchqueue();
cout << "在队列中查找5出现的次数为:" << a.search( 5 ) << endl;
}
输出结果:
采用链式结构,原理一致。