数据结构:表

来源:互联网 发布:安卓锁屏软件 编辑:程序博客网 时间:2024/06/14 10:58

表是一种线性的数据结构,对于形如A0,A1,A2,...,AN1一般的表,这个表大小是N,我们将表长为0的表称为空表。
表的数组实现:
printList 时间复杂度:O(N)
findKth 时间复杂度:O(1)
insert 和 delete 时间复杂度:O(N)

链表实现:
为了避免插入和删除的线性时间复杂度我们允许链表以不连续的内存存储
每一个结点包含数据域和链接域
printList 时间复杂度 O(N)
findKth 时间复杂度 O(N)
insert 和 delete 时间复杂度 O(1)

C++STL中的Vector和List
三个通用的方法:
1. int size()const:返回容器内的元素个数
2. void clear():删除容器内的所有元素
3. bool empty():容器为空返回true,否则返回false

vector 和 list两者都支持在常数时间在表末尾增加或删除项,在常量时间访问表的前端
4. void push_back(const Object&x):在表的末尾增加元素
5. void pop_back():删除表末尾的元素
6. const Object&back()const:返回表的末尾的元素
7. const Object&front()const:返回表的前端的元素

双向链表仅仅支持对表前端的高效操作,但是vector不支持
8. void push_front(const Object&x):在表的前端增加元素
9. void pop_front():删除表前端的元素

vector也有list所不具有的方法,两个高效索引,两个内部容量查询
10. Object&operator[](int index):返回vector中index索引位置的元素,不进行边界检查
11. Object &at(int index):返回vector中index索引位置的元素,包含边界检查
12. int capacity()const :返回vector的内部容量
13. void reserve(int new capacity):设定vector的新容量,如果已有良好的估计可以避免对vector 的拓展。

我们一般在表中需要进行删除和插入操作时,需要位置标记。在STL中通过内置类型iterator来给出位置,例如list< string >,位置通过类型list< string >::iterator给出
一般需要处理三个问题:
第一,如何得到迭代器
iterator begin():返回容器第一项的一个适当的迭代器
iterator end():返回指向容器终止的标志(容器最后一项后面一个位置)的一个适当的迭代器
第二,迭代器可以执行什么操作
iter1!=iter2,iter1==iter2,++iter,–iter,*iter
第三,哪些表ADT方法需要使用迭代器作为形参
iterator insert(iterator pos,const Object&x):添加x到迭代器pos所指向的位置之前的位置,对list来说是常量时间,但对于vector来说不是的。返回值是一个指向插入位置的迭代器。
iterator erase(iterator pos):删除迭代器所给出位置的对象
iterator erase(iterator start,iterator end)

原创粉丝点击