栈(stack)
简介
栈是一种只能在一端进行插入或者删除操作的线性表。其中允许进行插入或者删除操作的一端称为栈顶。栈的插入和删除一般叫入栈和出栈。栈的顺序存储结构叫做顺序栈,栈的链式存储结构叫做链栈。
C++中栈的头文件为<stack>
声明
stack<数据类型> 对象;
例如:stack<int> s;
基本操作
- push(): 向栈内压入一个成员;
- pop(): 从栈顶弹出一个成员(在栈中将其删除),此函数不返回任何值;
- top(): 返回栈顶,但不删除成员;
- empty(): 如果栈为空返回true,否则返回false;
- size(): 返回栈内元素的大小;
注:栈只能对栈顶元素进行操作。
代码示例
#include<iostream>
#include<stack>
using namespace std;
int main(){
// 创建一个栈
stack<int> s;
cout<<"栈的长度为:"<<s.size()<<endl;
cout<<"入栈"<<endl;
for(int i=0;i<10;i++){
// 将元素压入栈
s.push(i);
cout<<s.top()<<endl;
}
cout<<"栈的长度为:"<<s.size()<<endl;
cout<<"出栈:"<<endl;
// 判空
while(!s.empty()){
// 取栈顶元素
cout<<s.top()<<endl;
// 弹出栈顶元素
s.pop();
}
cout<<"栈的长度为:"<<s.size()<<endl;
return 0;
}
运行结果:
队列(queue)
简介
队列也是一个线性存储表,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出FIFO(First In First Out)表。允许进行插入的一端称为队尾,运行删除的一端称为队头。队列的顺序实现称为顺序队列,链接实现称为链接队列。
C++中队列的头文件为<queue>
声明
queue<数据类型> 对象;
例如:queue<int> q;
基本操作
- push(): 向队尾压入一个成员;
- pop(): 将队头元素弹出,此函数不返回任何值;
- front(): 返回对头元素,但不删除成员;
- back() 返回队尾元素,但不删除成员;
- empty(): 如果队列为空返回true,否则返回false;
- size(): 返回队列长度;
注:队列只能移除队首元素,但可返回队首元素或者队尾元素
代码示例
#include<iostream>
#include<queue>
using namespace std;
int main(){
// 定义一个队列
queue<char> q;
char str[20] = "helloWorld";
cout<<"队列的长度为"<<q.size()<<"\n"<<endl;
cout<<"入队"<<endl;
for(int i=0;i<10;i++){
// 将新元素压入队列
q.push(str[i]);
cout<<"queue's back is "<<q.back()<<endl;
}
cout<<"队列的长度为"<<q.size()<<endl;
cout<<"\n出队"<<endl;
// 判空
while(!q.empty()){
cout<<"queue's front is "<<q.front()<<endl;
// 将对头弹出
q.pop();
}
cout<<"队列的长度为"<<q.size()<<endl;
}
运行结果
二叉搜索树
简介
搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用作字典或优先级队列。二叉搜索树是最简单的搜索树。其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值。
基本概念
- 父节点与子节点(parent and child):由一个结点可以引出的一个或两个结点,该结点称为其所引出节点的父节点,被引出的节点称为父节点的子节点
- 根(root):唯一没有父节点的节点
- 叶节点(leaf):没有子节点的节点
- 内部节点(internal node):除叶节点以外的节点
- 度(degree):节点的子节点数
- 深度(depth):从该节点到某一节点的路劲长度称为该节点的深度
- 高(height):某一节点到叶节点的最长路径长度称为该节点的高
- 树高:根节点的高度
C++的STL中基于二叉搜索树有数据结构set和map
1.set
set是根据元素值进行排序的集合,所以插入的元素在集合中具有唯一性。
常用操作
begin() | 返回指向第一个元素的迭代器 |
end() | 返回指向最后一个元素的迭代器 |
clear() | 清除所有元素 |
insert() | 在集合中插入元素 |
erase() | 删除集合中的元素 |
find() | 返回一个指向被查找到元素的迭代器 |
empty() | 如果集合为空,返回true |
max_size() | 返回集合能容纳的元素的最大限值 |
size() | 集合中元素的数目 |
lower_bound() | 返回指向大于(或等于)某值的第一个元素的迭代器 |
upper_bound() | 返回大于某个值元素的迭代器 |
代码示例
#include<iostream>
#include<set>
using namespace std;
void print(set<int> s){
// 输出集合中元素的数目
cout<<"size:"<<s.size()<<endl<<"元素:";
// 使用迭代器遍历集合
for(set<int>::iterator it = s.begin();it!=s.end();it++){
cout<<" "<<(*it);
}
cout<<endl;
}
int main(){
// 声明一个set类型
set<int> s;
// 插入值
s.insert(8);
s.insert(3);
// 注意,重复插入的值会被忽视
s.insert(3);
s.insert(7);
s.insert(1);
// 输出当前set
print(s);
// 删除指定值
s.erase(7);
print(s);
// 查找元素
if(s.find(1) == s.begin())
cout<<"\nfind it"<<endl;
// 清空集合
s.clear();
print(s);
return 0;
}
运行结果
2.map
map以键值对为元素,集合以键作为排序标准。集合中的键具有唯一性。
声明
map<string, string> mapStudent;
常用操作
clear() | 清除 map 中所有元素; |
erase() | 删除 map 中指定位置的元素; |
insert() | 在 map 指定位置添加 pair 类型的元素; |
find() | 获取 map 中元素的迭代器 |
begin(), end() | map 的正向迭代器的起始位置与终点位置; |
代码示例
#include<iostream>
#include<map>
#include<string>
using namespace std;
void print(map<string,int> T){
// 声明map的一个迭代器
map<string, int>::iterator it;
// 输出map的size
cout<<T.size()<<endl;
// 使用迭代器遍历map
for(it = T.begin();it!=T.end();it++){
// 注意,要通过pair才能遍历值
pair<string,int> item = *it;
cout<<item.first<<"-->"<<item.second<<endl;
}
cout<<endl;
}
int main(){
// 声明一个map集合
map<string, int> T;
// 加入键值对
T["red"] = 32;
T["blue"] = 688;
T["yellow"] = 122;
// 对特定键对应的值进行操作
T["blue"] += 312;
print(T);
// 通过pair的方法加入键值对
T.insert(make_pair("zebra",101010));
T.insert(make_pair("white",0));
print(T);
// 删除键值对
T.erase("yellow");
print(T);
// 输出指定的键值对
pair<string,int> target = *T.find("red");
cout<<target.first<<"-->"<<target.second<<endl;
return 0;
}
运行结果