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

yizhihongxing

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日

相关文章

  • html添加ico镜像代码(favicon.ico放在根目录)

    下面是详细讲解“html添加ico镜像代码(favicon.ico放在根目录)”的完整攻略。 什么是favicon.ico? Favicon指的是网站上的图标,一般出现在网页标题前面、浏览器标签页上、收藏夹中等。而favicon.ico则是一种包含网站图标的文件,可以在浏览器的地址栏和标签页上显示。通常将favicon.ico文件放在网站根目录下。 html…

    other 2023年6月27日
    00
  • Java中final作用于变量、参数、方法及类该如何处理

    final作用于变量 当final作用于变量时,表示该变量的值只能被赋值一次,一旦赋值不能更改。在Java中,final变量通常被用作常量或配置信息等需要被保护的不可变数据。 示例代码: public class FinalVariableExample { public static void main(String[] args) { final int…

    other 2023年6月26日
    00
  • 3Dmax初始化失败一直停留在initializing界面该怎么办?

    首先,3Dmax初始化失败一直停留在initializing界面可能由以下原因导致: 应用程序文件受损或缺失; 3Dmax所需的系统文件损坏或缺失; 3Dmax版本与操作系统不兼容; 显卡驱动不兼容; 显卡失败等。 为了解决这个问题,我们可以使用以下方法: 方法一:删除配置文件 步骤1:按下窗口键和R键,打开运行窗口。 步骤2:输入%LOCALAPPDATA…

    other 2023年6月20日
    00
  • Android 6.0官方下载 安卓6.0技术预览版系统下载地址汇总

    Android 6.0官方下载 安卓6.0技术预览版系统下载地址汇总 如果您想在您的 Android 设备上尝试最新的 Android 6.0 系统,可以下载安装 Android 6.0 的技术预览版。本文将介绍如何下载并安装该预览版本,并提供一些下载地址的汇总。 步骤1:准备工作 在下载 Android 6.0 技术预览版之前,需要先做一些准备工作: 确保…

    other 2023年6月26日
    00
  • vmware共享文件夹后mnt没有目录

    vmware共享文件夹后mnt没有目录 问题描述 使用vmware虚拟机,在Host和Guest系统之间共享文件夹时,如果没有按照正确的步骤进行设置,可能会出现共享文件夹之后,Guest系统的/mnt目录下没有相应的目录的情况。 解决方法 方法一:检查mount点 首先,在Guest系统中,确认已经安装了open-vm-tools,并且vmware的共享文件…

    其他 2023年3月28日
    00
  • 水星无线路由器怎么设置静态ip即WAN口里设置静态的IP

    水星无线路由器设置静态IP的攻略 步骤1:登录路由器管理界面 首先,确保您已经连接到水星无线路由器的网络。然后,打开您的Web浏览器,输入默认的管理界面地址(通常为192.168.1.1或192.168.0.1),并按下Enter键。这将打开水星无线路由器的登录页面。 步骤2:输入管理员凭据 在登录页面上,输入您的管理员用户名和密码。如果您没有更改过这些凭据…

    other 2023年7月30日
    00
  • Spring技巧之如何动态读取配置文件

    当我们开发一个项目时,可能需要动态读取配置文件,以便根据不同的环境(如开发环境、测试环境、生产环境)来加载不同的配置参数。Spring框架提供了很好的支持,使我们可以轻松地实现动态读取配置文件,并且还可以轻松地进行参数配置和管理。 Spring提供了两种主要的动态读取配置文件的方式:使用PropertyPlaceholderConfigurer或使用Prop…

    other 2023年6月25日
    00
  • Creo直线怎么变成构造线? Creo中构造线的制作方法

    Creo直线变成构造线的方法 在Creo中,将直线转换为构造线是一种常见的操作。构造线是一种特殊类型的几何元素,用于辅助设计和约束模型。下面是将直线转换为构造线的详细步骤: 首先,打开Creo软件并加载您的模型。 选择直线:使用选择工具(通常是箭头图标),单击并选择您想要转换为构造线的直线。您可以使用鼠标拖动来选择直线。 右键单击选择的直线:在选择直线后,右…

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