10.1-5

算法导论10.1-5习题解答(deque实现源码)

CLRS 10.1-5
栈的插入和删除操作都是在一端进行的,而队列的插入和删除却是在两头进行的。有一种双端队列(deque),其两端都可以做插入和删除的操作。对于一个用数组构造的双端队列,请写出四个在两端进行插入和删除操作的过程,要求运行时间为O(1)。
 
复制代码
#include  < iostream >
using namespace  std;

template 
< class  T >
class  Deque
{
public :
  void  push_front(T t);
  void  push_back(T t);
  T pop_front();
  T pop_back();
  Deque(
int  m);
  ~ Deque();
 
private :
  T
*  arr;
  int  max;
  int  count;
  int  head;
  int  tail;
};

int  main()
{
  Deque
< int >  d( 3 );
  d.push_front(
0 );
  d.push_back(
2 );
  d.push_front(
4 );

  cout
<< d.pop_front() << endl;
  d.push_back(
3 );
  cout
<< d.pop_back() << endl;
  return 0 ;
}

template 
< class  T >
void  Deque < T > ::push_front(T t)
{
  if (count  ==  max)
  {
    cout
<< " deque is full " << endl;
    return ;
  }
  // 保证新插入的元素总在前面
  head  =  (head  == 0 ?  max  - 1  : head  - 1 ;
  arr[head] 
=  t;
  count
++ ;
}

template 
< class  T >
void  Deque < T > ::push_back(T t)
{
  if (count  ==  max)
  {
    cout
<< " deque is full " << endl;
    return ;
  }
  // 保证新插入的元素总在后面
  tail  =  (tail  ==  max  - 1 ? 0  : tail  + 1 ;
  arr[tail] 
=  t;
  count
++ ;
}

template 
< class  T >
T Deque
< T > ::pop_front()
{
  if (count  == 0 )
  {
    cout
<< " deque is empty " << endl;
    return  NULL;
  }
  int  temp  =  head;
  head 
=  (head  ==  max  - 1 ? 0  : head  + 1 ;
  count
-- ;
  return  arr[temp];
}

template 
< class  T >
T Deque
< T > ::pop_back()
{
  if (count  == 0 )
  {
    cout
<< " deque is empty " << endl;
    return  NULL;
  }
  int  temp  =  tail;
  tail 
=  (tail  == 0 ?  max  - 1  : tail  - 1 ;
  count
-- ;
  return  arr[temp];
}

template 
< class  T >
Deque
< T > ::Deque( int  m)
{
  max 
=  m;
  count 
= 0 ;
  head 
= 0 ;
  tail 
=  m  - 1 ;
  arr 
= new  T[m];
}

template 
< class  T >
Deque
< T > :: ~ Deque()
{
  delete[] arr;
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值