C++算法学习1

表,栈和队列

一.表(在C++标准模版库)

1.vector(可增长的数组实现)常量时间内可索引,插入/删除代价昂贵
2.list(双向链表实现)插入/删除代价小,不容易索引

vector和list 的方法:

int size() const; 返回容器中元素个数
void clear()
bool empty()
void push_back(const Object &x); 在表的末尾添加X
void pop_back(); 删除表末尾的对象
const Object & back () const; 返回表末尾的对象(也提供返回引用的修改函数)
const Object & front () const; 返回表前端的对象(也提供返回引用的修改函数)

双向链表支持在表的前段进行改变(vector不支持)
void push_front(const Object &x); 在list前端添加X
void pop_front(); 在list前端删除对象

vector具有而list不具有的操作
Object & operator [] (int index); 返回vector中index索引位置的对象(不包括边界检测)
Object & at (int index); 返回vector中index索引位置的对象(包括边界检测)
int capacity() const; 返回vector内部容量
void reserve(int new capacity); 设定vector的新容量

内置类型:迭代器

1. 获得迭代器
iterator begin(); 返回指向容器的第一项的一个迭代器
iterator end(); 返回指向容器的终止标志(容器最后一项的后面的位置)的一个迭代器
2.迭代器常见的操作
itr++ & ++itr
*itr; 返回存储在迭代器itr指定位置的对象的引用
itr1 == itr2
itr1 != itr2

for(vector<int>::iterator itr = v.begin(); itr != v.end(); itr++)
cout<<*itr<<endl;

3.需要迭代器的容器操作

  • iterator insert (iterator pos , const Object &x) 添加X到迭代器pos所指向位置之前的位置,这对list是常量时间操作,对vector不是
  • iterator erase(iterator pos) 删除迭代器位置的对象,这对list是常量时间操作,对vector不是,返回之前pos指向元素的下一个元素的位置,pos失效
  • iterator erase(iterator start , iterator end) 删除所有从start开始,到end结束的所有元素(不包括end本身)
  • c.erase(c.begin() , c.end()); 删除整个表

4.示例:使用迭代器间隔地删除表中的项:

template<typename Container> 
void removeEveryOtherItem(Container & lst)
{
 typename Container ::iterator itr = lst.begin();
 while(itr != lst.end)
 {
   itr = erase(itr);
   if(itr != lst.end())
   itr++;
 }
}

5.const_iterator
const_iterator的星号返回常量引用,不能出现在赋值语句的左边,而iterator的星号返回该项本身

向量的实现

template<typename Object>
class Vector
{
  public: 
  explicit Vector(int initSize = 0)
  : theSize(initSize) , theCapacity(initSize + SPACE_CAPACITY)
  {objects = new Object[theCapacity];}
  
  Vector(const Vector & rhs): objects(NULL)
  {objects= (rhs); }
  
  ~Vector()
  {delete [] objects; }
}

const Vector &operator = (const Vector &rhs)
{
  if(this != this)
  {
    delete [] objects;
    theSize = rhs.theSize();
    theCapacity = rhs.theCapacity;
    objects = new Object[capacity()];
    for(int k = 0 ; k < size() ; k++)
    objects[k] = rhs[k];
  }
  return *this;
}

双向链表的实现(list)

template<typename Object>
class List
{
  private:
  struct Node
  {
    Object data;
    Node *prev;
    Node *next;
    Node(const Object &d = Object() , Node *p = NULL , Node *n = NULL): data(d) , prev(p) , next(n) {}
  }
  public:
  class const_iterator
  class iterator
 
  public:
  List()
  {
    init();
  }
  ~List()
  {
    clear();
    delete head;
    delete tail;
  }
  List(const List & rhs)
  {
    init();
    *this = rhs;
  }
 const  List & operator = (const List & rhs)
 {
  if(this == &rhs)
  return *this;
  clear();
  for(const_iterator itr = rhs.begin() ; itr != rhs.end() ; itr++)
  push_back(*itr);
  return *this
 }
}
void init()
{
  theSize = 0;
  head = new Node;
  tail = new Node;
  head->next = tail;
  tail->prev = head;
}
private:
int theSize;
Node *head;
Node *tail;

二. 栈(stack)

栈是限制插入和删除操作只能在一个位置上的表,该位置是表的末端,称为栈顶(top),对栈的基本操作有进栈(push)和出栈(pop),栈也被称为LIFO(后进先出)表。

栈的实现

1.链表实现
2.数组实现

栈的应用

1.平衡符号
2.后缀表达式(逆波兰记法):时间复杂度O(N)
3.中缀到后缀的转换
4.函数调用

队列(queue)

表的一种,插入在一端进行,删除在另一端进行

数组实现:循环数组

back = front - 1;

队列的应用

文件服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值