【c++】栈教程

今天来讲讲栈


栈是什么?

老样子,先来看一道题:

【栈】栈的基本操作

描述

栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作。因此,表头对于栈来说具有特殊的意义,称为栈顶。相应地,表尾称为栈底。不含任何元素的栈称为空栈。

栈的逻辑结构:假设一个栈 SS 中从顶到底的元素为 a_n,a_{n-1},\ldots,a_1an​,an−1​,…,a1​,则称 a_1a1​ 为栈底元素,a_nan​ 为栈顶元 素。栈中的元素按 a_1,a_2,..,a_{n-1},a_na1​,a2​,..,an−1​,an​ 的次序进栈。在任何时候,出栈的元素都是栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出 (Last In First Out) 表,简称为 LIFO 表。所以,只要问题满足 LIFO 原则,就可以使用栈。

举个生活中的例子,比如洗碗,先洗的碗在底层,后面洗的碗会叠在先洗的碗的上面。这样在使用的时候,最后洗的碗就会先拿。

在程序实现上,栈也是用数组来存放的,需要一个数组下标变量来控制数据在数组的存入和读取等操作。

由于 C++ 的 STL 本身提供了栈这种数据结构,你只要学会使用 STL 的栈操作就行了。

后面学的递归(回溯)算法,递归会调用系统栈是来实现(这个是递归内部实现,我们不用去操作),只是理解栈这个结构会帮助我们更好地理解递归这个算法。当然,栈本身在一些题目上也会用到。

首先看一下 C++ 栈的方法的基本用法:

push():向栈内压入一个成员;

pop():从栈顶弹出一个成员;

empty():如果栈为空返回true,否则返回false

top():返回栈顶,但不删除成员;

size():返回栈内元素的大小;

普通栈的操作:

#include<iostream>
#include<stack>  //使用栈需要的头文件 
using namespace std;
int x; 
int main(){stack <int>stk; //定义一个整数类型的栈变量 //入栈for(int i=0;i<50;i++){cin>>x;stk.push(x);  // 数据入栈 }cout<<"栈的大小:"<<stk.size()<<endl;while(!stk.empty()){cout<<stk.top()<<endl;  //取出栈顶数据 stk.pop();   //删除栈顶数据,就是出栈 }cout<<"栈的大小:"<<stk.size()<<endl;return 0;
}

结构体栈的使用:

#include<iostream>
#include<stack>  //使用栈需要的头文件 
using namespace std;
struct people{int sg,tz;char xb;
}; 
people x; 
int n;
int main(){stack <people> stk; //定义一个结构体类型的栈变量 //入栈cin>>n;for(int i=0;i<n;i++){cin>>x.sg>>x.tz>>x.xb; stk.push(x);  // 结构体数据入栈 }cout<<"栈的大小:"<<stk.size()<<endl;while(!stk.empty()){x= stk.top();  //取出栈顶数据cout<<x.sg<<"  "<<x.tz<<"  "<<x.xb<<endl;  //取出栈顶数据 stk.pop();   //删除栈顶数据,就是出栈 }cout<<"栈的大小:"<<stk.size()<<endl;return 0;
}

现给定一组栈的操作(入栈与出栈),要求按顺序输出出栈的数,和最终留在栈里的数。

输入

一行若干个正整数,以0结尾。

操作有如下几种:

  • 1 x:表示将 x 入栈;
  • 2:表示将栈顶弹出。

输出

第一行按顺序输出出栈的数;无则输出空行;

如果出现栈满并且还有数据进栈则单行输出:the stack is full!

如果出现栈空并且还有数据出栈则单行输出:the stack is empty!

最后一行如果栈里还有数据则输出栈里的数(注意:出现栈满情况时也要输出栈里剩余的数)。

输入样例 1 

1 3 1 2 2 1 1 2 0

输出样例 1

2 1
3

输入样例 2 

1 3 2 2 1 3 1 4 1 5 1 6 0

输出样例 2

3the stack is empty!

提示

对于 100% 的数据,栈的最大容量为 300,每次需要入栈的正整数小于等于 10^9。

来源

lzy

首先我来讲一下展示怎么样的东西

这里有一个羽毛球筒

|  |
|  |
|  |
|  |

现在我把一号球放进去:

|  |
|  |
|  |
|1|

现在我把二号球放进去:

|  |
|  |
|2|
|1|

现在我们要取出一个球,我们只能先取出2,再取出1(先进入的数字反而最后出来,也就是先进后出)(考试经常考哦)

|  |       ——>2(取出)
|  |
|  |
|1|

|  |       ——>2(取出)
|  |       ——>1(取出)
|  |
|  |

这就是栈,像一个羽毛球筒


栈怎么写?

定义是这样的:

stack<int> q;
//其中,<>里的数据类型代表q的类型
//比如现在q为int型
//如果把int改为longlong,q就是longlong型

其他的操作室这样的:

q.size()//求q的大小(元素个数,比如栈里有1和2,元素个数就是2) 
!q.empty()//判断q是否为空(空就是没有元素)如果空了就返回1(真),否则返回2(假) 
q.top();//获取栈顶的数字,比如刚刚的羽毛球筒,放了1和2,用这个就会返回2 
q.pop();//弹出栈顶(把栈顶删掉),将最后一个放入的2拿出,就可以用这个 
q.push(x);//入栈,也就是把x跟球一样放进栈里
//注意了!不管你怎么用,都要加个括号
//q.size()这种返回数字的东西,是可以当数字来用的
//比如if(q.size()==300) ,就是判断q的元素个数是不是等于300
//a=q.top();就是a=栈顶的那个数字 

所以我们就可以解出最开始的那道题了:
 

#include<bits/stdc++.h>
using namespace std;
int main(){stack<int> q;//定义 long long a,x;//定义(a读的是前面的1或2) do{cin>>a;//读入 if(a==1){//a==1说明要入栈 if(q.size()==300){//如果说栈已经满了 cout<<endl<<"the stack is full!"<<endl;//输出 while(!q.empty()){//循环,栈没空就一直循环 cout<<q.top()<<" ";//输出栈顶 q.pop();//弹出栈顶,为下一次的输出做准备 }				return 0;}//否则就可以正常入栈了 cin>>x;//读入 q.push(x);//入栈 }else if(a==2){//如果要弹出 if(q.empty()){//如果栈空了,就弹不了了 cout<<endl<<"the stack is empty!";//输出 return 0;}cout<<q.top()<<" ";//否则输出栈顶 q.pop();//弹出栈顶 }}while(a!=0);//a==0就是要停止输入了 cout<<endl;while(q.size()!=0){//循环,只要栈的元素个数!=0就一直循环 cout<<q.top()<<" ";//输出 q.pop();//弹出 }return 0;
}

你知道我写了多久吗?写了20分钟。这还不值得你给我点个赞吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

佳易王羽毛球馆计时计费软件灯控系统安装教程

佳易王羽毛球馆计时计费软件灯控系统安装教程 佳易王羽毛球馆计时计费软件&#xff0c;点击开始计时的时候&#xff0c;自动打开灯&#xff0c;结账后自动关闭灯。 因为场馆每一场地的灯功率都很大&#xff0c;需要加装交流接触器。这个由专业电工施工。 1、计时计费功能 &…

docker安装mysql8

之前自己在网上找了一些docker安装mysql8的方法&#xff0c;结果都不行&#xff0c;于是自己根据自己遇到的情况再结合网上搜索到的安装方式调整了一下&#xff0c;成功执行安装。以下是我自己的执行命令 先拉取docekr镜像 docker pull mysql:8.0.20启动镜像 docker run -p 3…

使用Git bash切换Gitee、GitHub多个Git账号

Git是分布式代码管理工具&#xff0c;使用命令行的方式提交commit、revert回滚代码。这里介绍使用Git bash软件来切换Gitee、GitHub账号。     假设在gitee.com上的邮箱是alicefoxmail.com 、用户名为alice&#xff1b;在github上的邮箱是bobfoxmail.com、用户名为bob。 账号…

tcp/ip协议2实现的插图,数据结构2 (19 - 章)

(68) 68 十九1 选路请求与消息 函rtalloc,rtalloc1,rtfree (69)

HarmonyOS ArkTS 保存应用数据(十)

1 概述 在移动互联网蓬勃发展的今天&#xff0c;移动应用给我们生活带来了极大的便利&#xff0c;这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置&#xff0c;HarmonyOS应用开发也不例外。 2 什么是首选项 首选项为应用提供Key-Value键…

Java面向对象第2天

精华笔记&#xff1a; 构造方法&#xff1a;构造函数、构造器、构建器---------------复用给成员变量赋初始值代码 作用&#xff1a;给成员变量赋初始值 与类同名&#xff0c;没有返回值类型(连void都没有) 在创建(new)对象时被自动调用 若自己不写构造方法&#xff0c;则编…

Electron+VUE3开发简版的编辑器【文件预览】

简版编辑器的功能主要是: 打开对话框,选择文件后台读取文件文件前端展示文件内容。主要技术栈是VUE3、Electron和Nodejs,VUE3做页面交互,Electron提供一个可执行Nodejs的环境以及支撑整个应用的环境,nodeJS负责读取文件内容。 环境配置、安装依赖这些步骤就不再叙述了。 …

SQL Server 百万数据查询优化技巧三十则

点击上方蓝字关注我 互联网时代的进程越走越深&#xff0c;使用MySQL的人也越来越多&#xff0c;关于MySQL的数据库优化指南很多&#xff0c;而关于SQL SERVER的T-SQL优化指南看上去比较少&#xff0c;近期有学习SQLSERVER的同学问到SQL SERVER数据库有哪些优化建议&#xff1f…

Linux进程通信——信号(一)

原理 对于 Linux来说&#xff0c;实际信号是软中断&#xff0c;许多重要的程序都需要处理信号。 信号&#xff0c;为 Linux 提供了一种处理异步事件的方法。比如&#xff0c;终端用户输入了ctrlc来中断程序&#xff0c;会通过信号机制停止一个程序。 概述 信号的名字和编号 …

【Docker】从零开始:8.Docker命令:Commit提交命令

【Docker】从零开始&#xff1a;8.Docker命令:Commit命令 基本概念镜像镜像分层什么是镜像分层为什么 Docker 镜像要采用这种分层结构 本章要点commit 命令命令格式docker commit 操作参数实例演示1.下载一个新的ubuntu镜像2.运行容器3.查看并安装vim4.退出容器5提交自己的镜像…

【数据结构/C++】线性表_双链表基本操作

#include <iostream> using namespace std; typedef int ElemType; // 3. 双链表 typedef struct DNode {ElemType data;struct DNode *prior, *next; } DNode, *DLinkList; // 初始化带头结点 bool InitDNodeList(DLinkList &L) {L (DNode *)malloc(sizeof(DNode))…

成为AI产品经理——模型评估概述

目录 一、模型宣讲和评估的原因 二、模型宣讲 三、模型评估 1. 重要特征 ① 特征来源 ②特征意义 2.选择测试样本 3.模型性能和稳定性 一、模型宣讲和评估的原因 刘海丰老师提到他们在做一个金融AI产品未注重模型指标&#xff0c;过于注重业务指标&#xff0c;导致产生…

解决:ImportError: cannot import name ‘Adam‘ from ‘keras.optimizers‘

解决&#xff1a;ImportError: cannot import name ‘Adam‘ from ‘keras.optimizers‘ 背景 在使用之前的代码时&#xff0c;报错&#xff1a; from keras.optimizers import Adam ImportError: cannot import name ‘Adam’ 报错问题 from keras.optimizers import Adam I…

2023年亚太数学建模大赛--A题(水果采摘机器人的图像识别功能)

中国是世界上最大的苹果生产国&#xff0c;年产量约为 3500 万吨。同时&#xff0c;中国也是世界上最大的苹果出口国&#xff0c;世界上每两个苹果中就有一个出口到国。世界上每两个苹果中就有一个来自中国&#xff0c;中国出口的苹果占全球出口量的六分之一以上。来自中国。中…

Vue CLI的介绍【vue利器之一】

文章目录 前言Vue CLI 介绍CLICLI 服务CLI 插件后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;vue.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&am…

【Java 进阶篇】Redis持久化之RDB:数据的安全守护者

Redis&#xff0c;作为一款高性能的键值存储系统&#xff0c;支持多种持久化方式&#xff0c;其中RDB&#xff08;Redis DataBase&#xff09;是其最常用的一种。RDB可以将当前时刻的数据快照保存到磁盘&#xff0c;以便在Redis重启时快速恢复数据。本文将深入探讨RDB的原理、配…

飞书智能伙伴之 AI 数智参谋:先进团队,北极星指标也要遥遥领先

11 月 22 日&#xff0c;飞书在 2023 秋季飞书未来无限大会上正式发布了飞书智能伙伴。作为首批生态伙伴&#xff0c;基于 Kyligence 智能一站式指标平台实现的 AI 数智参谋也正式亮相。这是继 11 月 21 日 Kyligence 产品发布会后&#xff0c;Kyligence 在数据驱动决策智能领域…

第十五届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组(详细分析解答)

目录 1.动态的Tab栏 1.1 题目要求 1.2 题目分析 1.3 源代码 2.地球环游 2.1 题目要求 2.2 题目分析 2.3 源代码 3.迷惑的this 3.1 题目要求 3.2 题目分析 3.3 源代码 4.魔法失灵了 4.1 题目要求 4.2 题目分析 4.3 源代码 5.燃烧你的卡路里 5.1 题目要求 5.2…

第十七章:数据库操作

数据库基础 SQL语言 1、select 语句 select 语句用于从数据中检索数据。语法如下&#xff1a; SELECT 搜选字段列表 FROM 数据表名 WHERE 条件表达式 GROUP BY 字段名 HAVING 条件表达式(指定分组的条件) ORDER BY 字段名[ASC|DESC] 2、insert 语句 insert 语句用于向表中插入…

重新使用hbase前

启动关闭Hadoop和HBase的顺序一定是&#xff1a; 启动Hadoop—>启动HBase—>关闭HBase—>关闭Hadoop 1.挂载共享文件夹到挂载点 sudo mount -t vboxsf virtualmachineShare /mnt/shared2.进入hadoop目录下启动hadoop cd /usr/local/hadoop/ ./sbin/start-all.sh …