数据结构-练习3 队列的数组实现

我们知道,队列是使用的最常见的数据结构之一。常用的队列的实现有两种方法,数组和链式结构。下面用数组实现以下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;
}

输出结果:


采用链式结构,原理一致。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值