数据结构与算法(C++版):表、栈和队列
2017-06-06 11:37
274 查看
前言
本系列博客为学习数据结构与算法过程中的原创笔记,其中代码实现基于C++语言。STL中的向量和表
在C++语言的库中包含有公共数据结构的实现,这就是众所周知的标准模版库(Standard Template Library, STL)。表就是STL实现的数据结构之一。表有两个流行的实现。
vector给出了表的可增长的数组实现。使用vector的优点是长度可自由控制,且在常量的时间里是可索引的。缺点是插入和删除操作的代价是昂贵的,除非操作发生在vector的末尾。
list提供了表的双向链表实现。
使用list的优点是, 如果变化发生的位置已知的话, 插入新项和删除已有项的代价是很小的。
缺点是list不容易索引。
vector和list两者在查找时效率都很低。此类型的数据结构,都有公共的方法,下述的前三个方法事实上对所有的STL容器都适用。
int size() const:返回容器内的元素个数。
void clear():删除容器内所有元素。
bool empty():如果容器为空返回true,否则返回false。
vector和list都支持在表的末尾进行访问和操作。
void push_back( const Object & x ):在表的末尾添加x。
void pop_back():删除表的末尾对象。
const Object & back() const:返回表的末尾的对象。
const Object & front() const:返回表的末尾的对象。
双向链表允许在表的前端进行高效的改变,下面方法只对list有效。
void push_front( const Object & x): 在list的前端添加x。
void pop_front( ): 在list的前端删除对象。
vector也有list所不具有的特有的方法。 有两个方法可以进行高效的索引。 另外两个方法允许程序员观察和改变vector的内部容量。
Object & operator[] (int idx): 返 回vector中idx索引位置的对象, 不包含边界检
测( 也提供返回常量引用的访问函数)。
Object & at ( int idx ): 返 回vector中idx索引位置的对象, 包含边界检测( 也提供返回常量引用的访问函数)。
int capacity( ) const: 返回vector的内部容量。
void reserve( int new Capacity ): 设 定vector的新容量。 如果己有良好的估计的话, 这可以避免对vector进行扩展。
迭代器
迭代器是一种检查容器内元素并遍历元素的数据类型。可以替代下标访问vector对象的元素。迭代器通过iterator给出。例如,对于list<string>,定义为list<string>::iterator,对与vector<int>,定义为vector<int>::iterator。
以下列举迭代器一些相关的方法和操作。
iterator begin():返回指向容器的第一项的迭代器。
iterator end():返回指向容器的终止标志的迭代器(容器最后一项后面的位置)。
iter++和++iter:推进迭代器至下一个位置。
*iter:返回存储在迭代器iter指定位置的对象的引用。
下述代码列举了一个简单的对vector进行迭代器操作的使用。
#include <iostream> #include <vector> using namespace std; int main() { vector<int> data1 = {1, 2, 4, 6, 8}, data2; //定义data1, data2并初始化data1 vector<int>::iterator iter; //定义迭代器 cout << "data1 ="; for(iter = data1.begin(); iter != data1.end(); iter++) //迭代器的循环条件 { cout << " " << *iter; //输出data1 data2.push_back(*iter); //向data2写数据 data2.push_back((*iter) * 2); } cout << endl << "data2 ="; for(iter = data2.begin(); iter != data2.end(); iter++) { cout << " " << *iter; } cout << endl; return 0; }
栈
栈(stack)是限制插入和删除操作只能在一个位置上的表,这个位置是表的末端,称作栈的顶(top),栈顶元素是唯一可见(可访问)的元素。栈的基本操作有push(进栈)和pop(出栈)两种。栈有时又被称作LIFO(后进先出)表。栈的实现比较简单,此处不再详细介绍。
在C++的STL中,对栈进行了封装,加入头文件#include <stack>即可调用,其共有五个常用操作函数top()、push()、pop()、size()和empty(),STL中栈的操作如下:
stack<Elemtype > StackElem 创建一个空的stack对象
StackElem.top() 返回栈顶数据。
StackElem.push(elem) elem入栈
StackElem.pop() 弹出栈顶元素(出栈)
StackElem.size() 返回栈中数据的个数
StackElem.empty() 判断栈是否为空
下面代码是一个简单的栈的使用范例,包含上述所有函数。
#include <iostream> #include <list> #include <stack> using namespace std; int main() { /* * stack不是一种数据结构,是一种容器适配器(container adapter), * 因此它需要一个基础的容器来存储,这个容器可以是vector, deque,list * 等标准容器,未指定时默认是deque。 */ stack<string> stackTest; //定义栈stackTest存储数据类型为string string words; for(int i = 0; i < 5; i++) { cin >> words; stackTest.push(words); //words入栈 } cout << stackTest.size() << endl; //输出栈元素个数 while(!stackTest.empty()) //栈是否为空 { cout << stackTest.top() << " "; //输出栈顶元素 stackTest.pop(); //出栈 } cout << endl; return 0; }
队列
队列(queue)也是以表存储数据,但只允许从表的两端访问元素,而且限定从表的一端读入数据,从另一端读出数据。队列跟栈类似,没有迭代器,不能遍历,跟栈不同的地方是它属于FIFO(先进先出)表。queue的实现也是基于list,本文主要讲用法,因此不再介绍具体实现,可参考《STL源码剖析》一书。
在C++的STL中,同时也对queue进行了封装,加入头文件#include <queue>即可调用,其共有五个常用操作函数front()、back()、push()、pop()、size()和empty(),与栈的常用函数类似。STL中queue的操作如下:
queue<Elemtype > queueElem 创建一个空的queue对象
queueElem.front() 返回队列头部数据
queueElem.back() 返回队列尾部数据
queueElem.push(elem) 向队列尾部添加数据elem
queueElem.pop() 队列头部数据出队
queueElem.size() 返回队列中数据的个数
queueElem.empty() 判断队列是否为空
下面代码是一个简单的队列的使用范例,包含上述所有函数。
#include <iostream> #include <queue> #include <list> using namespace std; int main() { queue<string, list<string> > queueTest; //跟栈一样,此处用list存储 string words; for(int i = 0; i < 5; i++) { cin >> words; queueTest.push(words); //队首入队 } cout << queueTest.size() << " " << queueTest.back() <<endl; //输出队列长度和队尾元素 while(!queueTest.empty()) { cout << queueTest.front() << " " << endl; //输出队首元素 queueTest.pop(); //出队 } return 0; }
如你所见,本文只是简单的介绍了表,vector,栈和队列,而且并没有详细介绍各自的实现,只是借助STL介绍了他们的一些基础用法,希望对你有所帮助。
相关文章推荐
- 数据结构与算法(c++)——双缓存队列
- 程序员面试题精选(48):两个堆栈模拟队列c++代码实现
- 循环队列的实现(Queue, C++版)
- 链式队列的c++代码和原理以及编译分析
- 数据结构与算法(C++)之零——异常类(Exceptions)
- C++ 螺旋队列
- 用c++编写的数据结构循环队列
- C# 数据结构与算法系列(五) 队列
- c++实现循环队列
- C++多线程编程学习三 [FIFO队列设计]
- 自己写的一个简陋的C++队列模板
- 一个消息队列类的实现C++
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- C/C++中的堆、栈和队列
- 数组队列C++实现
- C++实现的队列queue
- 最小堆优先队列C++实现
- 数据结构与算法系列---队列
- C# 数据结构与算法系列(五) 队列
- C++ STL学习笔记三 deque双端队列容器