从C语言到C++/STL(三):stack与queue

目录

原文章:

所学习文章:

一、stack——栈(先进后出,后进先出)

1.首先仍是STL必备的——头文件,以及元素声明:

2.栈的方法函数:

3.栈的遍历:

4.返璞归真——用数组模拟栈进行遍历:

二、queue——队列(先进先出,后进后出)

1.基本操作:

2.方法函数:

3.使用

4.当然也可以用数组来实现:


原文章:

从C语言到C++/STL(三):stack与queue - 知乎

此文章为作者本人搬运至该网站。

所学习文章:

C++ STL总结 | 行码棋

在此向原作者表示感谢!


一、stack——栈(先进后出,后进先出)

stack大家应该很熟悉吧!就是数据结构里面的栈,如果对基础知识有些忘记的话,也可以看我之前写的关于栈的文章:

数据结构学习记录:第三章:栈-CSDN博客

在先前所学的数据结构里面的栈,其本质上就是一个数组,只不过是对输入输出有所限制,

而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——队列(先进先出,后进后出)

队列这东西我之前也有写过:

数据结构学习记录:第三章下半:队列-CSDN博客

想补充基础的可以看一下。

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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值