一、链表:list
1、用处及优势
链表对于一段数据的插入和删除操作具有很大的优势。而在数组、vector中,对于数据的插入与删除操作往往需要较高的时间复杂度。
2、STL中list的常见用法
cout << "预设长度和值" << endl;
list<int>l1(10, 0);
for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
list<int>li;
li.push_back(2);
li.push_back(1);
li.push_back(3);
li.push_back(3);
li.push_back(5);
li.push_back(7);
li.push_front(2);
li.push_front(1);
li.push_front(2);
li.push_front(1);
li.push_front(1);
li.pop_back();
li.pop_front();
cout << "原链表" << endl;
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "在某元素前插入" << endl;
for (list<int>::iterator it = li.begin(); it != li.end(); it++)//在某元素前插入
{
if (*it == 2)li.insert(it, 9);
}
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "在某元素前区间插入" << endl;
for (list<int>::iterator it = li.begin(); it != li.end(); it++)//在某元素前区间插入
{
if (*it == 2)li.insert(it, 2,8);
}
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "单点修改" << endl;
list<int>::iterator a;
int i = 1;
for (list<int>::iterator it = li.begin(); it != li.end(); it++,i++)//单点修改
{
if (i == 2)*it=0;
}
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "单点删除" << endl;
i = 1;
for (list<int>::iterator it = li.begin(); it != li.end(); it++, i++)//单点删除
{
if (i == 2)a=it;
}
li.erase(a);
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "区间删除" << endl;
i = 1;
list<int>::iterator l,r;
for (list<int>::iterator it = li.begin(); it != li.end(); it++, i++)//区间删除
{
if (i == 2)l = it;
if (i-1 == 5)r = it;
}
li.erase(l,r);
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "删除某一个元素" << endl;
li.remove(2); //删除某一个元素
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "倒转链表" << endl;
li.reverse();
for (list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
运行结果
预设长度和值
0 0 0 0 0 0 0 0 0 0
原链表
1 2 1 2 2 1 3 3 5
在某元素前插入
1 9 2 1 9 2 9 2 1 3 3 5
在某元素前区间插入
1 9 8 8 2 1 9 8 8 2 9 8 8 2 1 3 3 5
单点修改
1 0 8 8 2 1 9 8 8 2 9 8 8 2 1 3 3 5
单点删除
1 8 8 2 1 9 8 8 2 9 8 8 2 1 3 3 5
区间删除
1 9 8 8 2 9 8 8 2 1 3 3 5
删除某一个元素
1 9 8 8 9 8 8 1 3 3 5
倒转链表
5 3 3 1 8 8 9 8 8 9 1
二、双向队列:deque
1、用处及优势
在之前介绍的队列queue中,只支持对队列开头的输出操作与对队尾的输入操作。而双向队列则对于队首队尾都可以进行入队和出队操作
2、常见函数使用
对比queue,主要区别在于在pop与push函数后要加上front或者back
deque<int>dq;
dq.push_back(2);
dq.push_back(3);
dq.push_back(1);
dq.push_front(6);
dq.push_front(7);
dq.push_front(2);
for (deque<int>::iterator it = dq.begin(); it != dq.end(); it++)
cout << *it << ' ';
cout << endl;
dq.pop_back();
dq.pop_front();
for (deque<int>::iterator it = dq.begin(); it != dq.end(); it++)
cout << *it << ' ';
cout << endl;
三、栈能解决的一些问题
1、铁轨问题
紫书p140例题6-2铁轨问题
2、矩阵链乘
紫书怕41例题6-3矩阵链乘
简单的表达式可以通过栈的模拟来实现操作。遇到’)‘入栈就不停取出运算直到遇见’('继续push入栈。
作者:Avalon Demerzel,喜欢我的博客就点个赞吧,更多紫书知识点请见作者专栏《紫书学习笔记》