当前位置: 首页 > news >正文

c++详解栈

一.什么是栈

堆栈又名栈(stack),它是一种运算受限的数据结构(线性表),只不过他和数组不同,数组我们可以想象成一个装巧克力的盒子,你想拿一块巧克力,不需要改变其他巧克力的位置,而栈就相当于是一个只有上方有一个口且宽度只能容纳一块巧克力的盒子,如图:

那如果我们想拿最下面的巧克力该怎么办呢?就需要把这颗巧克力上面的所有巧克力都取出,这样才能取出最下面的巧克力。我们可以把栈想象成是一个封了底的数组,要想拿走一个值就需要把它上面的所有值都取出,同理,如果我们想加入一个数据,也只能加到栈的最顶端。这就是栈。

二.栈的具体实现 

1.手写栈

如果要手写一个栈,我们优先选择用和栈差别最小的数组模拟栈,我们要想模拟一个栈,需要拥有几个操作函数,如下。

①我们要编写push函数,作用是往栈里输入数据

     要想编写这样一个函数,我们首先需要确定数组(栈)的顶端,再把数放进去。我们可以定义一个栈的长度变量,初始值为0,你每输入一个数据就++。这样就可以很好的解决栈的输入了,我们看代码:

void push(char x) {  //top是栈的长度,M是所模拟的数组的长度,s是栈的名字,x是要往栈顶放的数if(top<M) {    //判断栈的长度不超过模拟它的数组的长度,则可以输入。top++;     //将栈顶++s[top]=x;  //把栈顶值设为x}
}

②我们要编写GetTop 函数,作用是获取栈顶的值

      这个很简单,我们直接获取数组的第top项就可以了。我们看代码:

char getTop() {return s[top];  //返回栈顶元素
}

③我们要编写弹栈函数,目的是删除栈顶元素,以取出下一个元素。

     我们可以直接让top--,这样原来的栈顶元素就不在这个栈中了,也就删除了栈顶元素。我们看代码:

void pop() {if(top>0) {  //如果栈不空top--;   //删除栈顶元素}
}

④我们要编写Getlen函数,目的是获取栈的长度。

       由于top就是代表着栈顶元素的位置,所以我们只要返回top的值就可以了。我们看代码:

int getlen() {return top;
}

接下来把所有函数都放在一起发个程序:

#include<iostream>
using namespace std;
const int M=10;   //M大小可动态调整
int s[M+1];
int top=0;
void push(int x) {if(top<M) {top++;s[top]=x;}
}
void pop() {if(top>0) {top--;} 
}
int getTop() {return s[top]; 
}
int getlen() {return top;
}int main() {return 0;
}

二.STL模板

有的人可能会说,手写栈实在太麻烦了,有没有简单的方法呢?当然有!接下来我就给大家讲。

STL模板不需要你手动定义栈中的函数,他已经给你定义好了函数和对应的栈,也不用你再用数组模拟了。但想用这个定义好了的栈,我们要导入一个头文件,如下

#include<stack>

一切准备就绪,我们要想定义一个STL栈,需要用如下代码:

stack<int>s; 

就是stack后面尖括号里写数据类型,然后再写一个栈名就可以了。

STL栈里面有一些常用的函数。

1.push,作用是往栈里输入一个数据,只不过是用栈名.push(输入的数据)的方式输入。如下:

s.push(x)

 2.top,和上面的Gettop函数的作用相同。也需要用栈名.top()的方式来调用。如下:

s.top();

3.pop,和上面的pop作用相同。如下:

s.pop();

4.size,和上面的Getlen函数作用相同。如下:

s.size();

三.例题

题目描述

假设一个表达式有英文字母(小写)、运算符(+-*/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255,左圆括号少于 20 个。

输入格式

一行:表达式。

输出格式

一行:YES 或 NO

输入输出样例

输入 #1复制

2*(x+y)/(1-x)@

输出 #1复制

YES

输入 #2复制

(25+x)*(a*(a+b+b)@

输出 #2复制

NO

说明/提示

表达式长度小于 255,左圆括号少于 20 个。

 程序 (装逼代码)

#include<bits/stdc++.h>
using namespace std;
stack<char> a;
int main() {string s;cin>>s;for(int i=0; i<s.length(); i++) {if(s[i]=='(') {a.push(s[i]);}if(s[i]==')') {if(a.size()>=1&&a.top()=='(') {a.pop();} else {cout<<"NO";return 0;}}}if(a.size==0)cout<<"YES";else cout<<"NO";return 0;
}

相关文章:

c++详解栈

一.什么是栈 堆栈又名栈&#xff08;stack&#xff09;&#xff0c;它是一种运算受限的数据结构&#xff08;线性表&#xff09;&#xff0c;只不过他和数组不同&#xff0c;数组我们可以想象成一个装巧克力的盒子&#xff0c;你想拿一块巧克力&#xff0c;不需要改变其他巧克…...

Zabbix结合Grafana打造高逼格监控系统

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…...

Linux设备树

一、起源 减少垃圾代码 减轻驱动开发工作量 驱动代码和设备信息分离 参考Open Fireware设计 用来记录硬件平台中各种硬件设备的属性信息 二、基本组成 两种源文件&#xff1a; xxxxx.dts dts是device tree source的缩写xxxxx.dtsi dtsi是device tree source include的缩…...

计算机方向的一些重要缩写和简介

参考&#xff1a; 深度学习四大类网络模型 干货|机器学习超全综述&#xff01; 机器学习ML、卷积神经网络CNN、循环神经网络RNN、马尔可夫蒙特卡罗MCMC、生成对抗网络GAN、图神经网络GNN——人工智能经典算法 MLP&#xff08;Multi Layer Perseption&#xff09;用在神经网络中…...

ardupilot开发 --- git 篇

一些概念 工作区&#xff1a;就是你在电脑里能看到的目录&#xff1b;暂存区&#xff1a;stage区 或 index区。存放在 &#xff1a;工作区 / .git / index 文件中&#xff1b;版本库&#xff1a;本地仓库&#xff0c;存放在 &#xff1a;工作区 / .git 中 关于 HEAD 是所有本地…...

Linux基础命令练习2

案例2&#xff1a;创建命令练习 请在/root创建三个目录分别为student、file、stu18 请在/opt创建三个文本文件分别为1.txt、a.txt、stu.txt 案例3&#xff1a;复制、删除、移动 在目录/opt下创建一个子目录 etime 在目录/opt/etime/创建文件readme.txt,利用vim写入内容 …...

Vue阶段笔记(有js包)

目录 1.要先上传Vue的js包&#xff0c;包的路径在这&#xff1a; 2.获取 3.定义Vue接管的区域和他所要实现的内容 #整体代码如下&#xff1a; Vue的指令(被绑定得必须有声明) #v-bind #v-model #v-on #V-ifV-else-ifV-elseV-show #v-show #v-for 1.要先上传Vue的js包&…...

执行npm run dev报Error: error:0308010C:digital envelope routines::unsupported问题

vue2element-ui项目&#xff0c;在执行npm run dev的时候突然报错&#xff1a; (node:19424) [DEP0111] DeprecationWarning: Access to process.binding(http_parser) is deprecated. (Use node --trace-deprecation ... to show where the warning was created) Er…...

解决微信小程序中 ‘nbsp;‘ 空格不生效的问题

在微信小程序开发中&#xff0c;我们经常会使用 来表示一个空格。这是因为在 HTML 中&#xff0c;空格会被解析为一个普通字符&#xff0c;而不会产生实际的空白间距。而 是一种特殊的字符实体&#xff0c;它被解析为一个不可见的空格&#xff0c;可以在页面上产生真正的空…...

vue el-select封装及使用

基于Element UI的el-select组件进行封装的。该组件实现了一个下拉选择框&#xff0c;具有许多可配置的属性和事件 创建组件index.vue (src/common-ui/select/index.vue) <template><el-selectref"select"v-model"hValue":allow-create"allo…...

了解linux计划任务

本章主要介绍如何创建计划任务 使用 at 创建计划任务 使用 crontab 创建计划任务 有时需要在某个指定的时间执行一个操作&#xff0c;此时就要使用计划任务了。计划任务有两种&#xff1a; 一个是at计划任务&#xff0c;另一个是 crontab计划任务。 下面我们分别来看这两种计…...

等待和通知

引入 由于线程是抢占式执行的,因此线程之间的执行的先后顺序难以预知 但是实际开发中我们希望合理协调多个线程之间执行的先后顺序. 这里的干预线程先后顺序,并不是影响系统的调度策略(内核里调度线程,仍然是无序调度). 就是相当于在应用程序代码中,让后执行的线程主动放弃被…...

vscode 如何将正则匹配到的字符前批量加字符

最近想用vscode将正则匹配到的东西签名批量https&#xff0c;替换时可以用$1来替换正则匹配到的字符串&#xff0c;如下所示...

上个月暴涨34.6%后,SoundHound AI股票现在还能买入吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 揭开SoundHound AI股价波动的原因 S&P Global Market Intelligence的数据显示&#xff0c;在摆脱了10月份的大幅下跌后&#xff0c;SoundHound AI的股价在11月份实现了34.6%的涨幅。 原因是该公司公布了稳健的第三季…...

Termux+Hexo结合内网穿透轻松实现安卓手机搭建博客网站发布公网访问

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…...

程序员的养生指南(生命诚可贵,一人永流传!珍惜生命,从你我做起)

作为程序员&#xff0c;我们经常需要长时间坐在电脑前工作&#xff0c;这对我们的身体健康造成了很大的影响。为了保持健康&#xff0c;我们需要采取一些养生措施来延寿。下面是我个人的一些养生经验和建议&#xff0c;希望能对大家有所帮助。 1、合理安排工作时间&#xff1a;…...

FP独立站怎么搭建?看这一篇就够了!强烈建议收藏!

在2023疫情结束年&#xff0c;商家为了在跨境电商市场上获取更多的份额&#xff0c;FP建站需求大军席卷而来&#xff0c;越来越多的创业者和企业开始涉足跨境电商独立站领域&#xff0c;尤其是FP独立站&#xff0c;FP商家想要通过FP独立站、FP广告投放&#xff0c;FP支付&#…...

【华为OD题库-068】找出经过特定点的路径长度-java

题目 输入一个字符串&#xff0c;都是以大写字母组成&#xff0c;每个相邻的距离是1&#xff0c;第二行输入一个字符串&#xff0c;表示必过的点。 说明 每个点可过多次。求解经过这些必过点的最小距离是多少? 示例1 输入输出示例仅供调试&#xff0c;后台判题数据一般不包含示…...

高性能队列框架-Disruptor使用、Netty结合Disruptor大幅提高数据处理性能

高性能队列框架-Disruptor 首先介绍一下 Disruptor 框架&#xff0c;Disruptor是一个通用解决方案&#xff0c;用于解决并发编程中的难题&#xff08;低延迟与高吞吐量&#xff09;&#xff0c;Disruptor 在高并发场景下性能表现很好&#xff0c;如果有这方面需要&#xff0c;…...

Linux学习笔记3 xshell(lnmp)

xshell能连接虚拟机的前提是真机能够ping通虚拟机网址 装OpenSSL依赖文件 [rootlocalhost nginx-1.12.2]# yum -y install openssl pcre-devel 依赖检测[rootlocalhost nginx-1.12.2]# ./configure [rootlocalhost nginx-1.12.2]# yum -y install zlib [rootlocalhost n…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...