【紫书第六章】链表(list)、栈和双向队列(deque)

一、链表: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,喜欢我的博客就点个赞吧,更多紫书知识点请见作者专栏《紫书学习笔记》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值