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日

相关文章

  • Anaconda安装以及修改环境默认位置图文教程

    以下是详细讲解“Anaconda安装以及修改环境默认位置图文教程”的完整攻略。 Anaconda安装教程 Step 1 下载Anaconda 打开Anaconda官网(https://www.anaconda.com/products/individual),选择符合本地系统版本的Anaconda,下载对应安装包即可。 示例1:如果本地系统是Windows系…

    other 2023年6月27日
    00
  • 前端从后端获得数据方法

    前端从后端获得数据是Web开发中的一个重要环节。以下是一个完整攻略,介绍了前端从后端获得数据的方法: 步骤1:后端API 要从后端获得数据,必须首先创建后端API。后端API是一组接口,用于从数据库或其他数据源检索数据,并将其返回给前端。 以下是一个示例: from flask import Flask, jsonify app = Flask(__name…

    other 2023年5月6日
    00
  • window.onload 加载完毕的问题及解决方案(上)

    针对“window.onload 加载完毕的问题及解决方案(上)”这个话题,我们需要分别从以下几个方面进行讲解: 什么是 window.onload? window.onload 是 JavaScript 中一个非常重要的事件,用于在页面中所有的资源(如文件、图片等)都加载完成后触发,也就是在文档的所有内容(包括 DOM、CSS、JS、图片)都已经加载完成后…

    other 2023年6月25日
    00
  • Github如何在Linux系统下创建本地仓库

    Github如何在Linux系统下创建本地仓库 在使用Github进行代码开发过程中,我们通常需要在本地创建一个仓库,并将代码上传到Github服务器上。对于Linux系统用户,创建本地仓库需要进行以下几个步骤: 安装Git 首先需要在Linux系统上安装Git。对于Debian/Ubuntu系统,可以通过以下命令安装: sudo apt-get insta…

    其他 2023年3月28日
    00
  • 苹果ios7完美越狱一键关机、重启、注销插件推荐 RePower怎么用?

    下面我将详细讲解“苹果ios7完美越狱一键关机、重启、注销插件推荐 RePower怎么用”的完整攻略。 背景介绍 RePower是一款针对越狱设备开发的实用插件,主要提供一键关机、重启、注销等快捷操作,方便用户快速执行关机、重启等功能。 插件安装 要使用RePower插件,首先需要安装Cydia软件(该软件是越狱设备上的一款应用商店),然后在Cydia中搜索…

    other 2023年6月27日
    00
  • VsCode搭建Go语言开发环境的配置教程

    VsCode搭建Go语言开发环境的配置教程 安装Go语言环境 前往Go语言官网 https://golang.org/dl/ ,选择对应版本的安装包进行下载并安装。安装完成后,在终端或命令提示符中输入go version,若出现版本信息说明安装成功。 安装VsCode 前往VsCode官网 https://code.visualstudio.com/ ,选择…

    other 2023年6月27日
    00
  • javascript嵌套函数和在函数内调用外部函数的区别分析

    JavaScript嵌套函数和在函数内调用外部函数的区别分析 在JavaScript中,函数可以嵌套在其他函数内部,也可以在函数内部调用外部函数。虽然这两种方式都可以实现类似的功能,但它们之间存在一些区别。下面将详细讲解这两种方式的区别,并提供两个示例说明。 嵌套函数 嵌套函数是指在一个函数内部定义另一个函数。嵌套函数可以访问外部函数的变量和参数,这种特性称…

    other 2023年7月28日
    00
  • 浅谈HDFS(三)之DataNote

    浅谈HDFS(三)之DataNote 在之前的文章中,我们已经探讨了HDFS的基础架构和数据流。今天,我们来谈一谈HDFS的DataNode。 DataNode的作用 在一个HDFS集群中,每个节点都需要开启DataNode服务。DataNode是HDFS的核心组成部分之一,其主要的任务是存储实际的数据块,并向NameNode汇报它持有的块信息。 当一个HD…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部