目录
原文章:
从C语言到C++/STL(三):stack与queue - 知乎
此文章为作者本人搬运至该网站。
所学习文章:
在此向原作者表示感谢!
一、stack——栈(先进后出,后进先出)
stack大家应该很熟悉吧!就是数据结构里面的栈,如果对基础知识有些忘记的话,也可以看我之前写的关于栈的文章:
在先前所学的数据结构里面的栈,其本质上就是一个数组,只不过是对输入输出有所限制,
而STL里面,就比较简单了。
1.首先仍是STL必备的——头文件,以及元素声明:
#include <stack> //头文件需要添加
//声明
stack<int> s;
stack<string> s;
stack<node> s; //node是结构体类型
下面三个分别是声明了名字为s的int型、string型、和结构体类型的栈。
这个 声明 的这一部分的概念对大家可能有点模糊,毕竟之前所学的栈都是比较形象地存储在数组里面,而这里只是一个数据类型,可能更加抽象了点。不过要是对于栈的进一步解释,我们就先往下看栈的函数以及遍历方法。
2.栈的方法函数:
这些都是比较基础的函数。
不过对于它们的运用方法,就需要结合下面的——栈的遍历。
相信我,等我讲清楚栈的遍历方法后,你应该就能理解STL中的栈的原理以及方法函数的运用了。
3.栈的遍历:
首先我们需要明确的一点就是,我们是无法对栈 s 直接操作的,要想操作,就只能借助上面的方法函数。
因此:
stack<int> st; //定义一个栈
for (int i = 0; i < 10; ++i) //给栈赋值元素
st.push(i);
while (!st.empty()) {
int tp = st.top(); //栈顶元素
cout << tp << endl; //从栈顶元素到栈底元素一个个输出
st.pop(); //出栈
}
现在来解释上面的这些代码:
由于栈只能对栈顶元素进行操作,那么想要给栈赋值元素,那么就只能用push函数把元素一个个压入栈(for循环);
下面这个while循环也很好解释,top函数是返回这个栈的栈顶元素(不删除这个元素);
而pop则是删除栈顶元素。
这下大家应该看明白了吧?栈只能从栈顶操作,于是其各种函数都是对栈顶元素进行处理的。
4.返璞归真——用数组模拟栈进行遍历:
当然如果实在不理解的话,我们也可以回归到数组里面:
int s[100]; // 栈 从左至右为栈底到栈顶
int tt = -1; // tt 代表栈顶指针,初始栈内无元素,tt为-1
for(int i = 0; i <= 5; ++i) {
//入栈
s[++tt] = i;
}
// 出栈
int top_element = s[tt--];
//入栈操作示意
// 0 1 2 3 4 5
// tt
//出栈后示意
// 0 1 2 3 4
// tt
这里大家应该能看懂吧?用数组下标来表示栈的第几个元素,以及栈顶指针tt。
至此,stack基本上讲完了,是不是挺简单的?
二、queue——队列(先进先出,后进后出)
队列这东西我之前也有写过:
想补充基础的可以看一下。
1.基本操作:
由于queue的内容和stack差不多,我就直接列出内容不讲了。
//头文件
#include<queue>
//定义初始化
queue<int> q;
这里也是和stack类似。
2.方法函数:
3.使用
使用方面我认为和stack大差不差,所以我就不赘述了,用下面这几行代码,各位应该就能看懂:
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<int> q;
for (int i = 0; i < 10; ++i)
q.push(i);
cout << "队首元素:" << q.front() << endl;
cout << "队尾元素:" << q.back() << endl;
q.pop();
cout << "删除第一个元素后,队首元素:" << q.front() << endl;
cout << "队长度:" << q.size() << endl;
return 0;
}
4.当然也可以用数组来实现:
#include<iostream>
using namespace std;
const int N = 1e5 + 5;
int q[N];
int main() {
int hh = 0,tt = -1; //hh表示队首元素的下标,初始为0,tt表示队尾元素的下标,初始为-1
//入队 ,队列一开始为空
q[++tt] = 1;
q[++tt] = 2;
//将所有元素出队
while(hh <= tt) {
int t = q[hh++];
printf("%d ",t);
}
return 0;
}