C++中Stack(栈)的使用方法与基本操作详解

C++中Stack(栈)的使用方法与基本操作详解

Stack是什么?

Stack(栈)是一种先进后出(Last In First Out)的线性数据结构,即最后被压入的元素会首先被弹出。栈的主要操作有“进栈”(push)和“出栈”(pop),以及“查看栈顶元素”(top)。

在C++中,我们可以使用STL(Standard Template Library)提供的stack容器来实现栈结构。

Stack的基本操作详解

初始化Stack

在使用Stack之前,需要先创建一个Stack对象来存储数据。STL提供了默认初始化的语法:

#include <stack>
using namespace std;

stack<int> st; // 创建空栈

上面的代码创建了一个空的Stack对象st,其中<int>表示存储的元素类型为整数。

进栈

将元素插入到栈的顶部需要使用push函数,例如:将3, 5, 7依次进栈,可以这样写:

st.push(3);
st.push(5);
st.push(7);

查看栈顶元素

使用top()函数可以查看栈顶元素,注意:使用top()前需确保栈不为空,否则会出现运行时错误。

if(!st.empty()){
    cout<<st.top()<<endl; //输出7
}

出栈

从栈中弹出元素需要使用pop()函数。例如:

st.pop(); //弹出栈顶元素7

判断栈是否为空

使用empty()函数可以判断栈是否为空,它返回一个bool值。例如:

if(!st.empty()){
    cout<<"栈不为空"<<endl;
}

获取栈的大小

使用size()函数获取栈的大小,它返回一个unsigned int类型。例如:

size_t size = st.size();
cout<<"栈的大小是:"<<size<<endl;

Stack的应用示例

例子一:括号匹配

使用栈判断表达式中的括号是否匹配,我们可以将左括号入栈,右括号时出栈比较:

bool isMatch(string s){
    stack<char> st;
    for(char c: s){
        if(c == '(' || c == '{' || c == '['){
            st.push(c);
        }
        else{
            if(st.empty()){
                return false;
            }
            if(c == ')' && st.top() != '('){
                return false;
            }
            if(c == '}' && st.top() != '{'){
                return false;
            }
            if(c == ']' && st.top() != '['){
                return false;
            }
            st.pop();
        }
    }
    return st.empty(); //如果栈为空,说明所有左括号都匹配
}

例子二:简单表达式求值

给定一个简单的表达式,其中只包含数字、加号、减号和括号,例如:(1+(4+5+2)-3)+(6+8),编写程序求出表达式的值:

int calculate(string s){
    stack<int> st_num;  //存储数字
    stack<char> st_op;  //存储运算符
    int num = 0;
    for(int i=0; i<s.size(); i++){
        char c = s[i];
        if(c == ' '){
            continue;
        }
        else if(c == '('){
            st_op.push(c);
        }
        else if(c == ')'){
            while(st_op.top() != '('){
                int num2 = st_num.top();
                st_num.pop();
                int num1 = st_num.top();
                st_num.pop();
                char op = st_op.top();
                st_op.pop();
                int res = op == '+' ? (num1 + num2) : (num1 - num2);
                st_num.push(res);
            }
            st_op.pop();  //弹出左括号
        }
        else if(isdigit(c)){
            num = num * 10 + (c - '0');
            if(i == s.size() - 1 || !isdigit(s[i+1])){
                st_num.push(num);
                num = 0;
            }
        }
        else{ //运算符
            while(!st_op.empty() && st_op.top() != '('){
                int num2 = st_num.top();
                st_num.pop();
                int num1 = st_num.top();
                st_num.pop();
                char op = st_op.top();
                st_op.pop();
                int res = op == '+' ? (num1 + num2) : (num1 - num2);
                st_num.push(res);
            }
            st_op.push(c);
        }
    }
    while(!st_op.empty()){
        int num2 = st_num.top();
        st_num.pop();
        int num1 = st_num.top();
        st_num.pop();
        char op = st_op.top();
        st_op.pop();
        int res = op == '+' ? (num1 + num2) : (num1 - num2);
        st_num.push(res);
    }
    return st_num.top();
}

总结

在本文中,我们详细讲解了C++中Stack(栈)的使用方法与基本操作,并给出了两个应用示例,希望能够帮助读者更好地了解和使用Stack。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中Stack(栈)的使用方法与基本操作详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 图文详解Linux服务器搭建JDK环境

    图文详解Linux服务器搭建JDK环境 在Linux服务器上搭建Java Development Kit (JDK)环境是开发Java应用程序的必要步骤。下面是在Ubuntu Linux操作系统上完整地搭建JDK环境的攻略。 步骤1:安装Java软件包管理器 在Ubuntu系统上,Java软件包管理器(PPA)可以帮助我们方便地安装和管理JDK。首先,我们需…

    other 2023年6月27日
    00
  • SpringBoot多环境配置及配置文件分类实例详解

    SpringBoot多环境配置及配置文件分类实例详解 SpringBoot的多环境配置是指在不同的应用环境中使用不同的配置参数。例如,在开发和生产环境中使用不同的数据库地址、账号和密码等参数。 为此,我们需要在应用的配置文件中进行相应的配置。本文将详细介绍SpringBoot多环境配置及配置文件分类,以示例说明。 配置文件分类 SpringBoot的应用配置…

    other 2023年6月25日
    00
  • Android提高Service优先级的方法分析

    Android提高Service优先级的方法分析 介绍 Service是Android中一种用于在后台执行长时间运行操作的组件。然而,默认情况下,Service在系统资源分配上的优先级相对较低,可能会受到系统资源紧张的影响。因此,当我们需要提高Service的优先级时,可以采取一些方法来实现。 本文将详细讲解Android提高Service优先级的方法,并提…

    other 2023年6月28日
    00
  • 详解Mysql 30条军规

    详解 MySQL 30 条军规 军规 1:避免在列上使用函数或表达式 在查询的 SELECT 语句中,应避免使用函数或表达式作用于列。例如,避免使用如下语句: SELECT AVG(product_price) FROM products; 查询中使用了 AVG 函数,会对表中的每一条记录进行求平均值的运算,应该修改为: SELECT product_avg…

    other 2023年6月25日
    00
  • Java Spring WEB应用实例化如何实现

    Java Spring是一个非常流行的企业级应用开发框架,它支持快速、可靠和易于维护的Web应用程序的开发。在这里,我们将提供一个完整的攻略来说明如何实现Java Spring WEB应用的实例化。 首先,我们需要准备好Spring框架的基础环境。我们可以通过Maven或Gradle等构建工具快速构建Spring项目,选择适当的依赖项,并在pom.xml或b…

    other 2023年6月26日
    00
  • SQL SERVER使用REPLACE将某一列字段中的某个值替换为其他的值

    要使用REPLACE函数将某一列字段中的某个值替换为其他的值,可以按照以下步骤进行操作: 首先需要连接到数据库,并选择需要操作的表。 接着,可以使用REPLACE函数来执行替换操作。REPLACE函数需要三个参数:要替换的原始字符串、要替换成的新字符串和原始字符串所在的列名。具体语法如下: UPDATE tableName SET columnName = …

    other 2023年6月25日
    00
  • visualsvn-server安装以及使用教程

    VisualSVN Server安装以及使用教程 简介 VisualSVN Server 是一个免费的 Subversion 服务器,可以在 Windows 环境下快速地建立和部署 Subversion 服务,可以为不同的项目提供一个稳定的版本管理平台。 安装步骤 下载 VisualSVN Server 打开 VisualSVN Server 官方网站 (h…

    其他 2023年3月29日
    00
  • 别墅无线WiFi覆盖解决方案

    以下是“别墅无线WiFi覆盖解决方案”的完整攻略。 确定需求 在开始部署无线网络之前,首先需要明确别墅无线WiFi覆盖的需求。比如需要覆盖的面积、设备数量、无线速率要求等等。只有确定了需求,才能针对性的选择设备,并进行合理布局。例如,假设一个别墅共有三层,面积300平方米,需要支持10台以上的设备同时连接,而且需要稳定的高速无线网络。 设备选购 根据需求,需…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部