C++ 栈( stack )学习

news2024/9/23 6:28:15

目录

1.栈

2.模拟栈

1.1.入栈( push )

1.2.出栈( pop )

1.3.获取栈顶元素( top )

3.直接使用栈( stack )

3.1.导入头文件并创建栈

3.2.栈的操作

3.2.1.入栈( push )

3.2.2.出栈( pop )

3.2.3.获取栈顶元素( top )

3.2.4.获取栈中元素个数( size )

3.2.5.判断栈是否为空( empty )

4.例


1.栈

栈简单来说就是图1一样的东西,每一层放一个数据。添加数据后像图2一样。栈的特点为先进后出。就是先进去的后出来,后进去的先出来。经常用于前缀表达式计算和后缀表达式计算。

图1
图2

2.模拟栈

要模拟栈需要先在全局定义数组和函数:

int stack[1001]; // int数组模拟栈
int TOP = 0; // 栈顶指针初始化

如果想要是别的类型的栈,把数组的数据类型和push(int x)的参数改一下就好了。

1.1.入栈( push )

定义入栈( 即在栈顶添加元素 )函数:

void push(int x)
{
    TOP++;
    stack[TOP] = x;
}

1.2.出栈( pop )

定义出栈( 即删除栈顶元素 )函数:

void pop()
{
    TOP--;
}

1.3.获取栈顶元素( top )

定义获取栈顶元素函数:

int top()
{
    return st[TOP]; // 返回栈顶元素
}

3.直接使用栈( stack )

可以使用stack头文件直接调用函数,且功能更多。

3.1.导入头文件并创建栈

在代码最前面输入

#include <stack>

在main函数中输入stack <数据类型> 栈名;就能定义一个栈。

3.2.栈的操作

3.2.1.入栈( push )

入栈( 在栈顶添加元素 )函数为push()。有参函数

队列名.push(x);

x为一个数据( 类型要和栈的类型一样 )。

3.2.2.出栈( pop )

出栈( 删除栈顶元素 )函数为pop()。无参函数。

队列名.pop();

3.2.3.获取栈顶元素( top )

获取栈顶元素函数为top()。无参函数。

队列名.top();

3.2.4.获取栈中元素个数( size )

获取栈中元素个数函数为size()。无参函数。

队列名.size();

3.2.5.判断栈是否为空( empty )

判断栈是否为空函数为empty()。无参函数。空返回1,不空返回0。

队列名.empty();

4.例

使用stack库进行后缀表达式运算。

#include <iostream> // 头文件
#include <stack>
#include <string>
#include <cmath>
using namespace std; // 命名空间

int main() // 主函数
{
    stack<string> s; // 定义栈
	string a; // 定义字符串
	getline(cin, a); // 带空格输入
    for (int i = a.length() - 1; i >= 0; i--)
	{
		int sum = 0, idx = 0;
		while (a[i] >= '0' && a[i] <= '9')
		{
			// 多位数处理
			sum = sum + (a[i] - '0') * pow(10, idx);
			idx++;
			i--;
		}
		if (sum != 0)
		{
			s.push(sum);
			continue;
		}
		// 符号处理
		int num1 = s.top();
		s.pop();
		int num2 = s.top();
		s.pop();
		if (a[i] == '+') // 加
		{
			s.push(num1 + num2);
		}
		else if (a[i] == '-') // 减
		{
			s.push(num1 - num2);
		}
		else if (a[i] == '*') // 乘
		{
			s.push(num1 * num2);
		}
		else if (a[i] == '/') // 除
		{
			if (num2 != 0)
			{
				s.push(num1 / num2);
			}
			else
			{
				s.push("wrong");
			}
		}
	}
	cout << s.top(); // 输出结果
	return 0; // 结束程序
}

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

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

相关文章

【第9章】Spring Cloud之Nacos服务配置

文章目录 前言一、改造前二、服务配置1. 添加依赖2. bootstrap.properties3. Data Id 发布配置4. 项目启动 三、改造后四、更多配置项总结 前言 一、改造前 这是我们之前服务注册和发现时使用的两个服务&#xff0c;在application.yml定义了服务注册的一些配置信息 二、服务…

系统架构设计师①:计算机组成与体系结构

系统架构设计师①&#xff1a;计算机组成与体系结构 计算机结构 计算机的组成结构可以概括为以下几个主要部分&#xff1a;中央处理器&#xff08;CPU&#xff09;、存储器&#xff08;包括主存和外存&#xff09;、输入设备、输出设备&#xff0c;以及控制器、运算器、总线和…

STM32智能机器人控制系统教程

目录 引言环境准备智能机器人控制系统基础代码实现&#xff1a;实现智能机器人控制系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与导航系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;机器人控制与优化问题解决方案与优化收尾与总结 1. 引言 智能机器人控…

js中的“?“/“??“以及“||“的详解(值得收藏)

前言 在JavaScript中&#xff0c;问号&#xff08;?&#xff09;通常用于三元运算符&#xff0c;而两个问号&#xff08;??&#xff09;则是空值合并运算符&#xff0c;用于在左侧操作数为null或undefined时&#xff0c;返回右侧的操作数。 1、?. &#xff08;可选链运算符…

NCRE3 1-4 宽带接入技术的基本类型

提示&#xff0c;这一部分内容大多数是记的 xDSL数字用户线技术 分类 按照上行和下行的速率是否相同分类分为速率对称性&#xff0c;速率非对称性 相关缩写 ADSL( 非对称数字用户线) 利用普通电话业务(POTS)方式&#xff0c;提供告诉数字业务,允许保留已有的模拟电话业务的…

【c++】C++类和对象详解(下)

目录 思维导图大纲&#xff1a; const成员函数 取地址运算符重载 再探构造函数-初始化列表 隐式类型转换 c语言中我们了解&#xff1a; c中&#xff1a; 单参数 多参数 防止类型转换 static成员 友元 内部类 匿名对象 对象拷贝时的编译器优化 思维导图…

第11讲:变量的基本

变量的数据类型分为基本数据类型、行生数据类型还有POU实例名三种。 此处主要讨论一下基本数据类型。 基本数据类型的种类 基本数据类型的表示方法 1、布尔型、位串型、常数 2、整数型 (1)有符号整数型 SINT型,INT型,DINT型及LINT型,为有符号整数型,二进制表示的最高…

Aigtek:电压放大器的选型方法有哪些

电压放大器是电子电路中常见的元件&#xff0c;用于将输入电压信号放大到所需的水平。在选择适合特定应用的电压放大器时&#xff0c;需要考虑多个因素&#xff0c;包括性能要求、电源电压、带宽、噪声等。下面安泰电子将详细介绍电压放大器的选型方法&#xff0c;以帮助工程师…

【深入理解SpringCloud微服务】深入理解Eureka核心原理

深入理解Eureka核心原理 Eureka整体设计Eureka服务端启动Eureka三级缓存Eureka客户端启动 Eureka整体设计 Eureka是一个经典的注册中心&#xff0c;通过http接收客户端的服务发现和服务注册请求&#xff0c;使用内存注册表保存客户端注册上来的实例信息。 Eureka服务端接收的…

SQLite读取分析指南:新手也能轻松上手的实用教程

SQLite是一个轻量级的关系型数据库&#xff0c;目前已经更新到SQLite3版本。它不仅具有跨平台的特性而且占用的资源非常低&#xff0c;目标是设计来做嵌入式的。本教程将深入浅出地讲解图形化界面和python脚本来读取sqlite数据库这两种方法,从基础概念到实际应用,step by step地…

Windows定时任务实现关闭和开启声音

目录 1. 下载并放置 nircmd.exe1.1 下载 NirCmd&#xff1a;1.2 放置 nircmd.exe&#xff1a; 2. 定时关闭声音2.1 打开任务计划程序&#xff1a;2.2 创建基本任务&#xff1a;2.3 设置任务名称和描述&#xff1a;2.4 触发器&#xff1a;2.5 操作&#xff1a;2.6 设置程序或脚本…

新手小白的pytorch学习第十弹----多类别分类问题模型以及九、十弹的练习

目录 1 多类别分类模型1.1 创建数据1.2 创建模型1.3 模型传出的数据1.4 损失函数和优化器1.5 训练和测试1.6 衡量模型性能的指标 2 练习Exercise 之前我们已经学习了 二分类问题&#xff0c;二分类就像抛硬币正面和反面&#xff0c;只有两种情况。 这里我们要探讨一个 多类别…

专业护眼灯品牌有哪些?五款爆款护眼灯品牌推荐

在当今时代&#xff0c;电子设备在我们的日常生活中扮演着越来越重要的角色。然而&#xff0c;长时间使用这些设备可能会增加眼睛疲劳和近视的风险。为了解决这一问题&#xff0c;护眼台灯应运而生&#xff0c;并逐渐成为许多家庭和办公室的必需品。面对市场上琳琅满目的护眼台…

<数据集>苹果腐烂识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;978张 标注数量(xml文件个数)&#xff1a;978 标注数量(txt文件个数)&#xff1a;978 标注类别数&#xff1a;2 标注类别名称&#xff1a;[fresh_apple, rotten_apple] 序号类别名称图片数框数1fresh_apple520922…

排序算法与复杂度介绍

1. 排序算法 1.1 排序算法介绍 排序也成排序算法&#xff08;Sort Algorithm&#xff09;&#xff0c;排序是将一组数据&#xff0c;依照指定的顺序进行排序的过程 1.2 排序的分类 1、内部排序&#xff1a; 指将需要处理的所有数据都加载到**内部存储器&#xff08;内存&am…

【NLP自然语言处理】基于BERT实现文本情感分类

Bert概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种深度学习模型&#xff0c;用于自然语言处理&#xff08;NLP&#xff09;任务。BERT的核心是由一种强大的神经网络架构——Transformer驱动的。这种架构包含了一种称为自注…

MySQL_JDBC

目录 一、JDBC常用的接口和类 1.1 数据库连接 Connection 1.2 Statement 对象 二、JDBC的使用 总结 【Java 的数据库编程】 JDBC 即 Java Database Connectivity (Java数据库连接)&#xff0c;是一种用于执行 SQL 语句的 Java API。这个 API 由 java.sql.*,javax.sql.* …

零基础学SpringBoot(一)--初识SpringBoot

1. SpringBoot简介 SpringBoot 是Spring家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程&#xff0c;也可以说Spring Boot能简化我们之前采用SSM(SpringMVC Spring MyBatis)框架进行开发的过程。 以前我们采用SSM框架进行开发的时候&#xff0c…

算法017:二分查找

二分查找. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/ 二分查找&#xff0c;其实是双指针的一种特殊情况&#xff0c;但是时间复杂度极低&#…

python的csv库常用操作

csv 模块是 Python 标准库中的一个模块&#xff0c;用于处理 CSV&#xff08;逗号分隔值&#xff09;文件。它提供了简单易用的功能来读取和写入 CSV 文件。以下是一些常用的操作&#xff1a; 一、读取 CSV 文件 新建文件data.csv&#xff0c;内容如下&#xff1a; 使用 csv.…