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日

相关文章

  • meta标签设置(移动端)

    什么是meta标签? meta标签是HTML文档中的一种特殊标签,用于提供有关文档的元数据信息。在移动端网页开发中,meta标签可以用于设置网页的视口(viewport)、缩放比例、主题颜色等信息。 meta标签设置(移动端) 以下是在移动端网页开发中常用的meta标签设置: 设置视口(viewport) 视口是指用户在浏览器中看到的网页区域。在移动设备上,…

    other 2023年5月7日
    00
  • JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码

    JavaScript禁用右键、禁用Ctrl+U、禁用Ctrl+S、禁用F12的实现代码可以通过以下步骤完成: 禁用右键 使用JavaScript可以禁用鼠标右键。可以通过以下代码来禁用右键: document.addEventListener("contextmenu", function(e){ e.preventDefault(); …

    other 2023年6月27日
    00
  • centOS下yum安装配置samba

    CentOS下yum安装配置samba Samba是一项实现了Windows和Linux/Unix之间文件和打印机共享的服务。如果你有Linux和Windows机器在同一局域网内,那么在CentOS上安装和配置Samba是非常有用的,可以方便地在Windows上访问Linux文件。 1. 安装Samba 使用 yum 命令直接在CentOS系统中安装Samb…

    其他 2023年3月28日
    00
  • mysql修改字段备注语句

    以下是关于MySQL修改字段备注语句的详细攻略: MySQL修改字段备注语句 在MySQL中,您可以使用ALTER TABLE语句修改表的结,包括添加、删除和修改列。如果您需要修改列的备注,可以使用以下语法: ALTER TABLE table_name MODIFY COLUMN column_name column_definition ‘new_com…

    other 2023年5月7日
    00
  • 深入理解javascript变量声明

    深入理解 JavaScript 变量声明攻略 JavaScript 变量声明是理解和使用 JavaScript 语言的基础之一。本攻略将详细介绍 JavaScript 变量声明的概念、不同的声明方式以及变量作用域的概念。 变量声明的概念 在 JavaScript 中,变量声明是为了存储和引用数据的标识符。通过声明变量,我们可以在程序中存储和操作数据。Java…

    other 2023年8月9日
    00
  • sql中 order by 和 group by的区别

    让我们来讲解一下“SQL中ORDER BY和GROUP BY的区别”: ORDER BY ORDER BY 是用于排序结果集的关键字。它将排序结果按照指定的列或表达式进行排序,可以使用 ASC (升序)或 DESC (降序)来指定排序方向,默认为升序。 下面是一些示例,说明 ORDER BY 是如何工作的。 示例1 我们使用下面的 SQL 语句查询一个表中的…

    other 2023年6月25日
    00
  • 使用Python将Mysql的查询数据导出到文件的方法

    将Mysql的查询数据导出到文件,可以采用Python的MySQLdb库来实现。具体步骤如下: 安装MySQLdb库 可以通过pip命令来安装: pip install MySQLdb 连接MySQL数据库 使用MySQLdb库的connect函数连接MySQL数据库,需要提供MySQL数据库的地址、端口、用户名、密码以及数据库名称等参数,示例代码如下: i…

    other 2023年6月26日
    00
  • java 反射: 当Timestamp类型的属性值为null时,设置默认值

    Java 反射:当 Timestamp 类型的属性值为 null 时,设置默认值 在 Java 中,反射是一个非常有用的工具,可以在运行时检测和修改代码的行为。使用反射可以在运行期间动态地访问和修改对象的属性和方法。本文将讨论在使用反射时,如何在 Timestamp 类型的属性值为 null 时设置默认值。 Timestamp 类型简介 Timestamp …

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