栈浅谈(上)

news2025/7/15 17:32:56

目录

栈的定义

栈的实现 

初始化

判断栈是否为空

 入栈操作

获取栈顶元素

出栈操作

遍历栈

销毁栈

完整代码演示

栈—STL 

基本操作

例题

参考代码


栈的定义

        说到栈,一些不会计算机语言的“小白”(我就是)就会想到栈道之类的词语,我们这里的栈指的是一种计算术语,它是一类数据结构。为什么叫栈呢?(你去问图灵)因为只不过这种数据结构的“外形”和栅栏(栈)有“一”点相似罢了。

        栈其实是一种运算受限的线性表。一种被限定仅在表尾进行插入和删除操作的线性表。只准插入或删除的一端叫做栈顶,而另一端叫做栈底。当一个新的元素放到栈中我们可以把它称为入栈,进栈或压栈,刚刚进去的元素我们把它叫做栈顶元素(注意:只有一个栈最顶端的元素才能被称作栈顶元素)。当栈中的一个元素出去时我们把它称为出栈或退栈(注意:出栈的时候只能栈顶元素出栈)它是把栈顶元素删掉,把与其相邻的元素当做栈顶元素。 是不是有点蒙,画个图你就知道了。

         如果还有点蒙的话,打个比方,栈就像是一个弹夹,将里面放子弹就相当于是进栈,出栈就相当于弹出子弹,先进后出(以后我会再次更新一篇关于队列的博文,队列是先进先出)。

接下来我们再来演示一遍出栈

栈的实现 

初始化

void Initstack(){
    top=-1;
}

判断栈是否为空

bool Empty(){
    if(top==-1){
        return true;
    }else{
        return false;
    }
}//判空函数

 入栈操作

void Push(int s, int x){
    if(top==MaxSize-1){
        cout<<"栈满"<<endl;
        return;
    }
    top++;
}
//入栈操作

获取栈顶元素

int Top(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return -1;
    }else{
        return top;
    }
}//读取栈顶元素

出栈操作

void Pop(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return;
    }
    top--;
}//出栈操作

遍历栈

void PrintStack(){
    while(top!=-1){
        top--;
        cout<<top<<" ";
    }
    cout<<endl;
}//遍历栈

销毁栈

void DestroyStack(){
    top=-1;
}销毁栈

完整代码演示

#include<bits/stdc++.h>
using namespace std;
void Initstack(){
    top=-1;
}//初始化
bool Empty(){
    if(top==-1){
        return true;
    }else{
        return false;
    }
}//判空函数
void Push(int s, int x){
    if(top==MaxSize-1){
        cout<<"栈满"<<endl;
        return;
    }
    top++;
}//入栈操作
int Top(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return -1;
    }else{
        return top;
    }
}//读取栈顶元素
void Pop(){
    if(top==-1){
        cout<<"栈空"<<endl;
        return;
    }
    top--;
}//出栈操作
void PrintStack(){
    while(top!=-1){
        top--;
        cout<<top<<" ";
    }
    cout<<endl;
}//遍历栈
void DestroyStack(){
    top=-1;
}//销毁栈
int main(){
	ios::sync_with_stdio(false);

	return 0;
}


​

其实栈还有另外的表达方式——STL闪亮登场

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。标准模板库是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。其中包含4个组件,分别为算法、容器、函数、迭代器。(源自百度百科)

栈—STL 

STL模板里关于栈的函数均已在上面呈现

Tip:在使用STL栈模板的时候要先创建:

#include<stack>//头文件
stack<int>s1;//入栈元素为 int 型
stack<string>s2;//入队元素为string型
stack<node>s3;//入队元素为自定义型

基本操作

push(x);//将x加入栈中,即入栈操作
pop();//出栈操作(删除栈顶),只是出栈,没有返回值
top();//返回第一个元素(栈顶元素)
size();//返回栈中的元素个数
empty();//当栈为空时,返回 true

例题

详见P1739 表达式括号匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

参考代码

​
#include<iostream>
#include<stack>
#define llu unsigned long long
stack <char> s;
using namespace std;
int main(){
	char s1[105];
	while(cin>>s1&&s1!=0){
		int n=strlen(s1);
		for(int i=0;i<n;i++){
			if(s1[i]=='('||s1[i]=='['||s1[i]=='{') s.push(s1[i]);
			else if(s1[i]==')'||s1[i]==']'||s1[i]=='}'){
				if(s.empty())s.push(s1[i]);
				else if(s1[i]==')'&&s.top()=='(') s.pop();
				else if(s1[i]==']'&&s.top()=='[') s.pop();
				else if(s1[i]=='}'&&s.top()=='{') s.pop();
				else s.push(s1[i]);
			}
		}
		if(s.empty())cout<<"yes"<<endl ;
		else cout<<"no"<<endl;
	}
	return 0;
}

今天对于栈的讲解到此结束,我们下一篇博文再见!!!

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

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

相关文章

基于JavaWeb的婚恋交友网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

如何平衡新老策略的好与坏,一道常见风控送命题解答

作为一个风控策略从业者&#xff0c;在做风险管理的过程中一直在做的就是&#xff0c;不断的挖掘有效的变量特征来填充风控决策体系&#xff0c;使决策体系的功效变大变强&#xff0c;最终形成一套可变的稳定风险护盾。我们常见的一个场景比如如何筛选一些新策略来挑战老策略&a…

【C++中预处理语句 include、define、if】

1.预处理阶段 预处理阶段&#xff0c;在实际发生编译之前就根据对应的预处理语句进行操作&#xff0c;等到预处理阶段完成之后才进行编译阶段 。 2.预处理语句 预处理语句主要有include、define、if 和 program。利用 # 进行标记 2.1 include语句 include语句就是将所包含的…

if-else练习

if单分支 输入两个数&#xff0c;分别放入x和y中&#xff0c;若两数不相等&#xff0c;则输出其中的大数&#xff0c;若两数相等&#xff0c;则输出字符串“xy&#xff1a;”并输出其值 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int a 0;int …

智慧油田解决方案-最新全套文件

智慧油田解决方案-最新全套文件一、建设背景1、智慧油田的概念及意义2、智慧油田的建设目标二、建设思路三、建设方案四、获取 - 智慧油田全套最新解决方案合集一、建设背景 1、智慧油田的概念及意义 石油产量、采收率、安全生产等都与石油工业未来息息相关&#xff0c;随着石…

十八、CANdelaStudio深入-Data Types

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的Data Types(数据类型),欢迎各位朋友订…

旧系统改造

背景 很多时候&#xff0c;我们在项目前期会优先确保项目业务的落地&#xff0c;在短时间内进行项目冲刺&#xff0c;最后完成项目上线。这样做让短时间内的目标达貌似达成了&#xff0c;却给系统留下了很大的隐患。 在项目的冲刺过程中&#xff0c;我们的精力大部分花在了业…

动态规划-不同路径

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示例 …

单源广度优先搜索 (leetcode经典例题 C++实现)

文章目录01矩阵地图分析腐烂的橘子深度优先搜索与广度优先搜索前情回顾&#xff1a; 深度搜索dfs与广度搜索bfs算法总结&#xff08;c 例题&#xff09; 本节是广度优先搜索的进阶&#xff1a; 01矩阵 传送门&#xff1a; https://leetcode.cn/problems/01-matrix/?envType…

JavaWeb----Servlet技术

JavaEE简介 什么是JavaEE JavaEE&#xff08;Java Enterprise Edition&#xff09;&#xff0c;Java企业版&#xff0c;是一个用于企业 级web开发平台,它是一组Specification。最早由Sun公司定制并发 布&#xff0c;后由Oracle负责维护。在JavaEE平台规范了在开发企业级web 应…

【操作系统】死锁(详细)

文章目录一、死锁的概念二、死锁的产生因素三、死锁的必要条件1、互斥条件2、占有和等待条件&#xff08;部分分配条件&#xff09;3、不剥夺条件4、循环等待条件&#xff08;环路条件&#xff09;四、死锁防止1、破坏互斥条件2、破坏占有和等待条件3、破坏不剥夺条件4、破坏循…

Ceph文件系统

目录 一、环境准备 二、什么是文件系统 三、ceph块存储与文件系统区别 四、创建ceph文件系统 1、启动MDS服务 2、创建存储池 3、创建Ceph文件系统 4、客户端挂载 一、环境准备 Ceph集群搭建参照&#xff1a;Ceph集群部署_桂安俊kylinOS的博客-CSDN博客 以下Ceph存储实…

springcloud22:sentinal的使用

sentinal对比&#xff08;分布式系统的流量防卫&#xff09; 监控保护微服务 Hystrix 需要自己去手工搭建监控平台&#xff0c;没有一套web界面可以进行细粒度化的配置&#xff0c;流控&#xff0c;速率控制&#xff0c;服务熔断&#xff0c;服务降级… 整合机制&#xff1a;se…

外卖项目08---Linux

目录 一、 Linux简介 119 二、Linux安装 120 三、常用命令 122 3.1Linux命令初体验 3.1.1 command [-options] [parameter] 3.2Linux常用命令---文件目录操作命令-ls&-cd&-cat 124 3.2.1list 3.2.2 cd 3.2.3 cat 3.3 Linux常用命令---文件目录操作命令…

9.前端笔记-CSS-CSS三大特性

三大特性&#xff1a;层叠性、继承性、优先级 1、层叠性&#xff08;覆盖性&#xff09; 给相同的选择器设置相同的样式&#xff0c;此时一个样式会覆盖&#xff08;层叠&#xff09;其他冲突的样式。 层叠性原则&#xff1a; 同一选择器&#xff0c;样式冲突&#xff0c;遵…

OpenMV输出PWM,实现对舵机控制

OpenMV的定时器官方函数介绍&#xff1a;Timer类 – 控制内部定时器 目录 OpenMV的PWM资源介绍 为什么要用OpenMV输出PWM OpenMV的PWM资源分配 资源 注意 建议 PWM输出代码 代码讲解 Timer Timer.channel tim.channel与Timer.channel区别 Timer.channel解析 OpenM…

Iframe通信

跨域的种类 一般有两种形式的跨域问题&#xff1a; ①使用XmlHttpRequest(XHR)或者使用AJAX发送的POST或者GET请求。这种形式的跨域是&#xff1a;前端页面与后端进行的跨域请求。 ②父子页面之间进行的DOM操作&#xff08;父子窗口之间的document操作&#xff09;。这种形式…

使用XShell、XFTP 连接 win7 虚拟机(windows、Linux无法远程登录问题)

文章目录前言出错原因&#xff08;题外话&#xff09;那么我们为什么要使用 SSH 连接开始操作&#xff08;Windows7&#xff09;首先进行 SSH 测试获取所需的openSSH文件安装openSSH添加环境变量ssh测试发布ssh服务开始操作&#xff08;Linux&#xff0c;以Ubuntu为例&#xff…

Linux启动流程分析

一、Linux启动流程图 二、硬件启动流程 2.1、POST Linux开机加电后&#xff0c;系统开始开机自检&#xff0c;该过程主要对计算机各种硬件设备进行检测&#xff0c;如CPU、内存、主板、硬盘、CMOS芯片等。主要完成检测硬件能否满足运行的基本条件&#xff0c;叫做“硬件自检(P…

【网络编程】第一章 网络基础(协议+OSI+TCPIP+网络传输的流程+IP地址+MAC地址)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…