算法导论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;
}

转载于:https://www.cnblogs.com/null00/archive/2011/04/16/2065059.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值