新学期被作业淹没,将博客晾在这太久了,不禁心生惭愧,于是将今晚本来计划去深圳湾公园散步的时间用来写文章。我在想,要写什么呢,看着案上的数据结构,就决定是你了!
看名字是第四章,我是不是错过了什么,其实是正在学栈和队列,剩下的三章会在国庆尽力填坑。
假设大家学过线性表,那么栈和队列就是特殊的线性表罢了。我上一次接触栈,是在汇编语言的学习处,是比较硬件的理解,现在学习数据结构,就是从软件、实用的角度来理解栈。
上图是栈的模型,栈是允许在同一端进行插入和删除操作的线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。我们已经在汇编中知晓push和pop,压入push是增加数据,而弹出pop是删除数据 ,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作 ,但读取栈中的数据是随便的没有接口约束之说。很多人都误解这个理念从而对栈产生困惑。
如果你不能理解栈的模型,那想象一下手枪压膛,先压入的子弹总是最后射出,这就是栈的原理。
考你一个问题:设将整数1、2、3、4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请问一个可以输出多少种结果?
答案是十四种,你可以写出来吗?
ok,我们来康康栈的定义(code)
前面说过,栈本质上是顺序表,那么我们可以用顺序表(链表来实现)但是C++有STL栈容器——stack,极大的方便了我们(相当于人家帮你定义好了)
stack堆栈容器的C++标准头文件为 stack ,必须用宏语句 "#include <stack>" 包含进来,才可对 stack 堆栈的程序进行编译。
下面是基本使用方法:
堆栈初始化:
1. stack()
默认构造函数,创建一个空的 stack 对象。
例如,下面一行创建一个空的堆栈对象 s 。
stack<int> s;
元素入栈
stack堆栈容器的元素入栈函数为 push 函数。由于 C++ STL 的堆栈函数是不预设大小的,因此,入栈函数就不考虑堆栈空间是否为满,均将元素压入堆栈,从而函数没有标明入栈成功与否的返回值。
如下是他的使用原型:
void push(const value_type& x)
元素出栈
stack容器的元素出栈函数为 pop 函数,由于函数并没有判断堆栈是否为空,才进行元素的弹出,因此,需要自行判断堆栈是否为空,才可执行 pop 函数。
void pop()
下面的示例代码,将堆栈的所有元素全部出栈
// stack<int> s;
while(!s.empty())
{
s.pop();// 出栈
}
取栈顶元素
stack容器的栈顶元素的读取函数为 pop 函数,将取出最后入栈的元素,如下是它的使用原型
value_type& top()堆栈非空判断
随着堆栈元素不断出栈,堆栈可能会出现空的情况,因此,一般需要调用 empty 函数判断是否非空,才作元素出栈和取栈顶元素的操作。
bool empty(). 布尔型,返回0或1;
判断堆栈是否为空,返回 true 表示堆栈已空,false 表示堆栈非空。感谢:以上内容改自CSDN博主 lyj2014211626 的c++ stl栈容器stack用法介绍 好文:
下面是对每个函数的用法:
//----------------------------------------- 读取堆栈的栈顶元素
#include <stack>
#include <iostream>
using namespace std;
int main()
{
// 创建堆栈对象
stack<int> s;
// 元素入栈
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
s.push(6);
// 元素依次出栈
while(!s.empty())
{
// 打印栈顶元素
cout << s.top() << endl;
// 出栈
s.pop();
}
return 0;
}
//检查栈的大小是否可容纳压入元素
#include <stack>
#include <list>
#include <iostream>
#define STACK_SIZE 100 // 堆栈最大容量
using namespace std;
int main()
{
// 用双向链表作堆栈的底层结构
stack<int, list<int> > s;
// 堆栈未满,元素才能入栈
if (s.size() < STACK_SIZE)
s.push(68);
if (s.size() < STACK_SIZE)
s.push(1);
if (s.size() < STACK_SIZE)
s.push(17);
// 元素出栈
while (!s.empty())
{
// 打印 17 1 68
cout << s.top() << endl;
s.pop();
}
return 0;
}
感谢:以上内容改自CSDN博主 lyj2014211626 的c++ stl栈容器stack用法介绍 好文: