数据结构基础知识——线性数据结构(向量、队列、栈)
目录:
- 基础知识
- C++版框架
- C++结构体
- C++模板
- STL常用算法
- vector(向量/不定长数组)
- set(集合)
- queue(队列)
- 应用实例
- 完数VS盈数【清华大学】
- 约瑟夫entity【程序员代码面试指南】
- 猫狗收容所【程序员面试金典】
- 摆动序列【Leetcode】
- 序列零-复杂性换位【上海交通大学】
- 完成括号匹配【2018校招真题在线编程】
- 堆栈的使用【吉林大学】
- 计算表达式【上海交通大学】
一、基础知识
1、C++版框架:
- C++能编译大多数C语言程序,虽然C语言中大部分头文件在C++中仍然可以使用,但推荐的方法是在C头文件之前加一个小写的c,然后去掉.h后缀。
- while(c >> a >> b):从标注输入中读取a,它的返回值是一个“已经读取了a的新流”,然后从这个新流中继续读取b。如果流已经读完,while循环将退出。
- #include <iostream>:iostream提供输入输出流。
- #include <algorithm>:algorithm提供一些常用算法。
- using namespace std:
- C++中有“名称空间”(namespace)的概念,用来缓解复杂程序的组织问题。
- 头文件iostream和algorithm里定义的内容放在std名称空间里。
- 如果代码和该名称空间里的内容不重名,就可以使用using namespace std的方法把std里的名字导入默认空间。这样就可以用cin代替std::cin,cout代替std::cout,min代替std::min了。
- const int maxn = 100 + 10; int A[maxn]:
- 声明数组时,数组大小可以用const声明的常数。在C++中,这种写法更为推荐(而不是使用#define)。
- C++提供了“引用”,在参数名之前加一个“&”符号,就表示这个参数按照传引用(by reference)的方式传递,而不是C语言里的传值(by value)方式传递。这样,在函数内改变参数的值,也会修改到函数的实参。
- C语言中的字符串就是字符数组,C++中提供string类型。
- 虽然string和sstream都很方便,但string很慢,sstream更慢,应谨慎使用。
- 在C++工程中,一般用struct定义“纯数据”的类型,只包含较少的辅助成员函数;而用class定义“拥有复杂行为”的类型。
2、C++结构体:
(1)示例:
- struct Point{
- int x, y;
- Point(int x = 0, int y = 0):x(x), y(y){}
- };
(2)解析:
- 结构体Point中定义一个构造函数(ctor),构造函数是在声明变量时调用的。例如,声明Point a, b(1, 2)时,分别调用了Point()和Point(1, 2)。等于0是默认值,调用Point()相当于调用Point(0, 0);
- x(x), y(y)是一个简单的写法,表示把成员变量x初始化为参数x,成员变量y初始化为参数y,也可以写成this->x = x; this->y = y;这里的this是指向当前对象的指针,this->x即(*this).x
(3)总结:
- C++的结构体可以拥有一个或多个构造函数,在声明变量时调用。
- C++中的函数(不只是构造函数)参数可以有默认值。
- 在C++结构体的成员函数中,this是指向当前对象的指针。
3、C++模板:
(1)示例:
- template <typename T>
- struct Point{
- T x, y;
- Point(T x = 0, T y = 0):x(x), y(y){}
- };
- //定义Point的加法运算符
- template <typename T>
- Point<T> operator + (const Point<T>& A, const Point<T>& B){
- return Point<T>(A.x+B.x, A.y+B.y);
- }
4、STL常用算法(Standard Template Library,标准模板库):
(1)<algorithm>中的sort函数:
- 可以对任意对象进行排序,包括内置类型和自定义类型
- 如果希望使用sort排序,这个类型需要定义“小于”运算符,或者在排序时传入一个“小于”函数。
- 排序对象可以存在于普通数组中,用sort(a, a + n)的方式调用;可以存在于vector中,用sort(v.begin(), v.end())的方式调用。
(2)<algorithm>中的lower_bound函数:
- 当用sort函数对数组排序后,用lower_bound(a, a + n, x)可以查找大于或等于x的第一个位置。
(3)<algorithm>中的unique函数:
- 删除有序数组中的重复元素。
(4)<cctype>中的isalpha函数:
- 判断字符是否为字母。
(5)<cctype>中的islower函数:
- 判断字符是否为小写字母。
(6)<cctype>中的toupper函数:
- 把字符转化为小写字母,非字母不做处理。
5、vector(向量/不定长数组):
(1)#include <vector>,vector是一个模板类,需要用vector<int> a或者vector<double> b这样的方式来声明一个vector。
(2)特点:
- 能够根据数据增加或减少而不断地将数组规模扩大或缩小的变长数组。
- vector之间可以直接赋值或者作为函数的返回值。
(3)STL -vector常用方法:
- vector尾部元素的添加或删除:
- a.push_back():向尾部添加元素。
- a.pop_back():删除最后一个元素。
- vector的状态:
- a.size():返回当前向量元素个数。
- a.empty():返回当前向量是否为空。
- vector元素操作:
- a.clear():清空向量。
- a.insert(a.begin() + 2, 3, 20):在第2个元素之后位置插入3个值为20的元素。
- a.erase(iterator position):删除某一固定位置元素。
- a.erase(iterator first, iterator last):删除从某个位置至另外一个位置之间的元素。
- a.resize():改变大小。
- vector迭代器操作:
- begin():返回向量中的首元素的迭代器。
- end():返回向量中尾元素后一个元素的迭代器end()。
- vector首尾元素: