栈--STL模版中的stack|c++基础--详细讲解

开头声明

本文由署髫亲自撰写并非转载

如果代码或文章内容有误,请大佬们及时指出。

部分内容是从网上复制的。

!!链接绝对安全无毒!!

点个呗~

什么是栈

是一种后进先出(‌LIFO)‌的数据结构,‌它支持两种主要的操作:‌进栈和出栈。‌在C++中,‌栈可以用数组或链表来实现,‌但使用数组实现的顺序栈在编程实践中更为常见。‌顺序栈的实现包括栈的初始化、‌销毁、‌判断是否为空、‌进栈、‌出栈以及获取栈顶元素等操作。‌C++标准模板库(‌STL)‌提供了一个<stack>头文件,‌其中定义了一个栈模板类。‌使用STL中的栈,‌只需要包含相应的头文件,‌并指定数据类型即可创建一个栈对象。‌

 举个例子

这是一个火车站(手搓的不太好看) ,每节车厢(1~9的数字)都可以单独行驶但都不能倒车,且车厢可以随意拆分、组合。我们可把栈看成这个火车站,把输入的数据看成车的每节车厢,每节车厢进入火车站就相入栈,出火车站就是出站。

 入栈顺序就是

1 2 3 4 5 6 7 8 9

出站顺序就是

9 8 7 6 5 4 3 2 1

学过栈的小伙伴应该知道栈入栈出栈的顺序是相反的,我们回到上面的图片

车厢1先入栈、然后是2,、3、4......直到全部入栈 ,就成了图中的样子,由于为尾部不去,所以只能从头部出栈顺序就是车厢9先出栈、然后是8、7、6......直到全部出栈,所以入栈顺序和出站顺序是相反的,所以站可以用来反转数据。

代码实现1

我们可以先用数组来模拟栈,用自定义函数来实现栈的功能。

创建一个栈

int a[1001],top=0;

因为我们要模拟栈,所以我用了数组来模拟。top代表的是入栈和出栈的位置

入栈

void push(int x){
	if(top<5){
		top++;
		a[top]=x;
	}
	return;
}

x就是我们要入栈的内容,判断top<5是要防止满栈后继续入栈,实际满栈的大小要根据题目来决定,top++就是说明我们这一位已经存储过了,a[top]=x就是把我们栈的这一位设置成我们要入栈的内容。

出栈

void pop(){
	if(top>0){
		top--;
	}
	return;
}

判断top>0就是防止top出现到负数导致报错,top--就是删除这一位的值,有的小伙伴会问“为什么不把当前的值归零呢?”因为就算我们不归零,也不会使用这一位了,就算在这一位入栈了,也会直接覆盖。

获取栈顶

int gettop(){
	return a[top];
}

获取栈顶只要返回栈的上一次删除的上一位或入栈的下一位即可。

判断是否为空

bool empty(){
    if(top==0){
        return 0;
    }
    return 1;
}

判断栈的首位是第几位,如果是最后一个,那么就空了,否则是未空的。

获取大小

int size(){
    return top;
}

因为top代表栈的首位是第几位,所以知道栈的首位是第几位就知道栈有多长了。

代码实题

4145 栈的操作--[简单]

描述

输入5个整数,将这5个整数进行入栈,接下来做三次出栈操作,按照出栈顺序输出出栈元素,以上操作完成后输出此时的栈顶元素。

输入描述

输入5个整数,用空格隔开。

输出描述

输出2行,第1行输出出栈元素,按照出栈顺序输出,用空格隔开。第2行输出完成出栈操作后的栈顶元素。

#include<bits/stdc++.h>
using namespace std;
int a[1001],top;
void push(int x){
	if(top<1000{
		top++;
		a[top]=x;
	}
	return;
}
void pop(){
	if(top>0){
		top--;
	}
	return;
}
int gettop(){
	return a[top];
}
int main(){
	int num;
	for(int i=0;i<5;i++){
		cin>>num;
		push(num);
	}
	for(int i=0;i<3;i++){
		cout<<gettop()<<" ";
		pop();
	}
	cout<<endl<<gettop();
	return 0;
}

主函数

int num;
for(int i=0;i<5;i++){
	cin>>num;
	push(num);
}

先定义一个num,用来接收输入数据,再写一个for循环,用来循环输入。把每一位输入后依次入栈。

for(int i=0;i<3;i++){
	cout<<gettop()<<" ";
	pop();
}
cout<<endl<<gettop();

根据题目要求,依次输出栈的前3位,最后换行输出栈顶(记得删除)。

代码实现2

我们可以用STL模版中的stack容器实现栈

STL模版stack容器(栈)的函数

stack<int>a;				//  通过STL模版创建栈

a.push(b);					//  向栈顶添加元素
a.pop();					//  从栈顶移除第一个元素
a.top();					//  返回栈顶元素
a.size();					//  栈中元素数量
a.empty();					//  判断是否为空

代码实题

1701 出栈--[简单+]

描述

有一个包含n个正整数的数字序列,还有一个整数栈。
定义两个操作:
x :将数字序列中的前一个位置中的数入栈,并将这个数从序列中删除
z :从整数栈中弹出栈顶元素,并输出
现在告诉你一系列包含两个操作的合法字符串,问出栈的数都有哪些值?

输入描述

输入第一行为一个正整数 n,接下来一行有 n 个正整数,再接下来一行为包含“ x ”、“ z ”两个操作的字符串

输出描述

按出栈的顺序输出出栈的整数,每个整数之间用一个空格隔开。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[1001];
    stack<int> s;
    int b,d=0;
    string c;
    cin>>b;
    for(int i=0;i<b;i++){
        cin>>a[i];
    }
    cin>>c;
    for(int i=0;i<c.length();i++){
        if(c[i]=='x'){
            s.push(a[d]);
            d++;
        }else if(c[i]=='z'){
            cout<<s.top()<<" ";
            s.pop();
        }
    }
	return 0;
}

主函数

int a[1001];
stack<int> s;
int b,d=0;
string c;
cin>>b;
for(int i=0;i<b;i++){
    cin>>a[i];
}
cin>>c;

因为题目没有明确要全部入栈,所以先放在列表里储存。先输入b,确定有几个数。再用for循环循环输入每一个数。最后根据题意输入一个字符串,用来存放要对栈进行的操作。

for(int i=0;i<c.length();i++){
    if(c[i]=='x'){
        s.push(a[d]);
        d++;
    }else if(c[i]=='z'){
        cout<<s.top()<<" ";
        s.pop();
    }
}

最后判断是要出栈还是进栈(根据题意得知x是入栈,z是出栈),按步骤操作即可。

视角拓展

基于STL模版中的栈,我们可以修改主函数的部分内容,实现其他程序。

我给大家挑了几道简单的小题,大家可以做一做:

1627 括号匹配问题升级版--[中等]

1680 调度员的烦恼--[中等-]

1665 木偶--[中等-]

都看到这儿了,就点个赞呗~

署髫只是个初中生,就点一个吗~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值