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。

阅读剩余 72%

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

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

相关文章

  • java string类的常用方法详细介绍

    Java String类的常用方法详细介绍 Java中的String类是一个非常常用的类,它提供了许多方法来处理字符串。在本攻略中,我们将详细介绍String类的常用方法,并提供一些示例说明。 1. 字符串长度 length() length()方法用于获取字符串的长度,即字符串中字符的个数。 示例: String str = \"Hello, W…

    other 2023年8月6日
    00
  • kotlin object关键字单例模式实现示例详解

    以下是使用Kotlin中的object关键字实现单例模式的完整攻略: Kotlin中的object关键字 在Kotlin中,object关键字用于创建一个单例对象。单例对象是指在整个应用程序中只存在一个实例的对象。 示例1:创建单例对象 object Singleton { fun doSomething() { println(\"Doing s…

    other 2023年10月15日
    00
  • 如何解决json中携带的反斜杠

    如何解决JSON中携带的反斜杠 在处理JSON数据的时候,我们常常会遇到携带反斜杠的字符串。这是因为在JSON中,某些特殊字符需要用反斜杠进行转义,比如双引号、单引号、斜杆、制表符等。而有时候,我们在处理JSON数据的时候,可能并不需要这些反斜杠,甚至会影响后续操作的进行。下面我们将介绍几种解决方法。 1. 使用JSON.parse方法 JavaScript…

    其他 2023年3月28日
    00
  • mysql 中如何取得汉字字段的各汉字首字母

    在 MySQL 中,可以使用 SUBSTRING() 函数、ASCII() 函数和REPLACE()函数来实现取得汉字字段的各汉字首字母。以下是具体的步骤: 步骤1:使用 SELECT 语句选择要获取首字母的汉字字段,例如表名为 table1,汉字字段名为 name,可以执行如下语句: SELECT name FROM table1; 步骤2:将汉字字段转换…

    other 2023年6月25日
    00
  • C语言数据结构线性表教程示例详解

    当我们学习C语言数据结构时,首先学习的应该是线性表,因为它是其他数据结构的基础。下面,我将详细讲解“C语言数据结构线性表教程示例详解”的完整攻略,帮助大家更好地掌握线性表的知识。 线性表的定义 线性表是由n(n>=0)个具有相同数据类型的数据元素a1,a2,……,an组成的有限序列,它有以下特点:1. 除a1外,每个元素都有一个直接前驱;2. 除an外…

    other 2023年6月27日
    00
  • Windows Powershell属性:描述对象是什么

    Windows PowerShell属性:描述对象是什么 在Windows PowerShell中,属性是用于描述对象的特征和状态的一种方式。属性提供了关于对象的信息,可以用于查看、修改和操作对象的属性值。以下是关于Windows PowerShell属性的详细攻略。 1. 查看对象的属性 要查看对象的属性,可以使用Get-Member命令。该命令会列出对象…

    other 2023年10月15日
    00
  • 通过adb命令发送广播

    以下是详细讲解“通过adb命令发送广播的完整攻略”的标准Markdown格式文本,包含两个示例说明: 通过adb命令发送广播的完整攻略 在Android开发中,我们可以通过adb命令发送广播,以触发应用程序中的广播接收器。本攻略将介绍如何通过adb命令发送广播。 步骤一:连接设备 首先,需要通过USB连接Android设备,并在开发者选项中启用USB调试模式…

    other 2023年5月10日
    00
  • 荣耀路由Pro如何备份配置文件?荣耀路由Pro备份配置文件的方法

    荣耀路由Pro支持备份配置文件,备份配置文件可以帮助用户在遇到重装路由器或者设置出现故障时,快速恢复之前的路由器设置和配置。 下面是荣耀路由Pro备份配置文件的详细攻略: 1. 进入荣耀路由Pro管理页面 首先需要连接到荣耀路由Pro设备,在浏览器中输入路由器设备 IP 地址,在登录页面输入用户名密码进入路由器配置页面。 2. 进入备份配置文件页面 在路由器…

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