C++中栈结构建立与操作详细解析

C++中栈结构建立与操作详细解析

什么是栈?

栈(stack)是一种特殊的数据结构,它只允许在一个端口进行插入和删除操作。这个端口常被称为栈顶(top)。栈的正常操作是先进后出(LIFO),也就是说后进入的元素会先被弹出。

举个例子,假设我们将一叠盘子放在桌子上,每新洗好一个盘子,我们就把它放在盘子栈的顶端。当我们需要取出盘子时,我们从栈顶开始一个一个地弹出,直到取到需要的盘子。

如何在C++中实现栈?

C++中实现栈最常用的方法是使用STL库中的stack。它提供了一系列函数用于实现栈的功能,包括:

  • push():在栈顶插入一个元素
  • pop():弹出并删除栈顶元素
  • top():返回栈顶元素的值
  • empty():检查栈是否为空
  • size():返回栈的大小

stack的定义如下:

#include <stack>

std::stack<int> myStack; // 这行代码定义了一个名为myStack的栈,存储int类型的元素

示例一:使用栈判断括号是否匹配

栈经常用于处理括号匹配问题。我们可以定义一个栈,遇到左括号则将其压入栈顶,遇到右括号则弹出栈顶元素并判断是否与此右括号匹配,若不匹配则括号不匹配。

以括号匹配为例,下面是一个示例程序:

#include <iostream>
#include <stack>

bool isBalanced(std::string str) {
    std::stack<char> myStack; // 定义一个char类型的栈
    for (char c : str) {
        if (c == '{' || c == '[' || c == '(') {
            myStack.push(c); // 左括号压入栈顶
        } else if (c == '}' || c == ']' || c == ')') {
            if (myStack.empty()) {
                return false; // 栈为空时,右括号未匹配
            }
            char top = myStack.top(); // 获取栈顶元素
            myStack.pop(); // 弹出栈顶元素
            if (c == '}' && top != '{') {
                return false; // 不匹配则返回false
            } else if (c == ']' && top != '[') {
                return false;
            } else if (c == ')' && top != '(') {
                return false;
            }
        }
    }
    return myStack.empty(); // 栈为空则括号匹配,否则不匹配
}

int main() {
    std::string str = "{[()]()}"; // 测试字符串
    if (isBalanced(str)) {
        std::cout << "括号匹配" << std::endl;
    } else {
        std::cout << "括号不匹配" << std::endl;
    }
    return 0;
}

在上述代码中,函数isBalanced接收一个字符串作为参数,返回一个布尔值以表示该字符串中的括号是否匹配。函数内部定义了一个char类型的栈myStack,通过遍历字符串str中的每一个字符判断是否为左括号或右括号,并根据左右括号的特性进行匹配判断。最终,如果栈为空,则说明括号匹配,否则不匹配。

示例二:使用栈将中缀表达式转换为后缀表达式

栈还可以用于将中缀表达式转换为后缀表达式。中缀表达式是我们平常使用的表达式形式,例如3 + 4 * 2 / ( 1 - 5 ) ^ 2。而后缀表达式则是将操作数放在前面、操作符放在后面的表达式形式,例如3 4 2 * 1 5 - 2 ^ / +

将中缀表达式转换为后缀表达式需要使用到栈。我们可以依次遍历中缀表达式中的每个元素:

  • 如果是操作数,则直接输出
  • 如果是左括号,则入栈
  • 如果是右括号,则将栈中元素弹出并输出,直到弹出左括号为止
  • 如果是操作符,则判断其优先级与栈顶操作符的优先级,如果更低(或相等)则弹出栈顶元素并输出,直到栈顶操作符的优先级小于该操作符
  • 如果遍历完成后栈中还有元素,则依次弹出并输出直到栈为空

下面是将中缀表达式转换为后缀表达式的示例程序:

#include <iostream>
#include <stack>
#include <string>
#include <sstream>

int priority(char op) {
    if (op == '+' || op == '-') {
        return 1;
    } else if (op == '*' || op == '/') {
        return 2;
    } else if (op == '^') {
        return 3;
    }
    return 0;
}

std::string infixToPostfix(std::string str) {
    std::stringstream ss;
    std::stack<char> myStack;

    for (char c : str) {
        if (isdigit(c)) {
            ss << c; // 如果是数字则直接输出
        } else if (c == '(') {
            myStack.push(c); // 如果是左括号则入栈
        } else if (c == ')') {
            while (!myStack.empty() && myStack.top() != '(') {
                ss << myStack.top(); // 弹出栈顶元素并输出,直到弹出左括号为止
                myStack.pop();
            }
            if (!myStack.empty() && myStack.top() == '(') {
                myStack.pop(); // 弹出左括号
            }
        } else {
            while (!myStack.empty() && priority(c) <= priority(myStack.top())) {
                ss << myStack.top(); // 弹出栈顶元素并输出,直到栈顶操作符的优先级小于该操作符
                myStack.pop();
            }
            myStack.push(c); // 将该操作符入栈
        }
    }

    while (!myStack.empty()) {
        ss << myStack.top(); // 如果栈中还有元素,则依次弹出并输出直到栈为空
        myStack.pop();
    }

    return ss.str(); // 返回后缀表达式
}

int main() {
    std::string str = "3+4*2/(1-5)^2"; // 中缀表达式
    std::string postfix = infixToPostfix(str); // 将中缀表达式转换为后缀表达式
    std::cout << postfix << std::endl; // 输出后缀表达式
    return 0;
}

在上述代码中,函数infixToPostfix接收一个字符串作为参数,返回一个字符串表示后缀表达式。函数内部定义了一个char类型的栈myStack,通过遍历输入字符串中的每一个字符,根据其是操作数、左括号、右括号还是操作符进行不同的操作,并输出后缀表达式。最终,返回后缀表达式字符串。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中栈结构建立与操作详细解析 - Python技术站

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

相关文章

  • git查看分支被合并记录

    以下是“git查看分支被合并记录”的完整攻略: git查看分支被合并记录 在使用git进行版本控制时,我们经常需要查看分支被合的记录。以下是在中查看分支被合并记录的步骤: 步骤1:切换到目标分支 在查看分支合并记录之前需要先切换到目标分支。以下是切换到目标分支的步骤: 打开命令行终端 切换您的git仓库目录。 输入以下命令来列出所有分支: git branc…

    other 2023年5月7日
    00
  • Stimulsoft Reports Ultimate 2019安装激活+中文设置图文教程

    安装Stimulsoft Reports Ultimate 2019的步骤: 首先进入Stimulsoft Reports Ultimate 2019的官方网站,下载最新版本的软件安装包。 下载完成后,运行安装程序。在安装程序提示你选择产品进行安装时,选择Stimulsoft Reports Ultimate 2019。 按照提示进行安装,选择安装路径,安装…

    other 2023年6月27日
    00
  • masm5.0汇编环境安装

    以下是关于“masm5.0汇编环境安装”的完整攻略,包括环境安装、配置和两个示例等。 环境安装 下载masm.0安装,可以从这里下载。 解压缩安装包到一个目中,例如C:\masm。 运行INSTALL.EXE,按照提示进行安装。 环境配置 将masm5.0的安装目录添加到系统的PATH环境变量中。在Windows 10中,可以按下Win+X键,选择“系统”,…

    other 2023年5月7日
    00
  • PHP Global变量定义当前页面的全局变量实现探讨

    PHP Global变量定义当前页面的全局变量实现探讨 在PHP中,全局变量是在整个脚本中都可访问的变量。然而,如果我们只想在当前页面中定义全局变量,可以使用$GLOBALS数组来实现。本攻略将详细讲解如何使用$GLOBALS数组来定义当前页面的全局变量,并提供两个示例说明。 步骤1:定义全局变量 要定义当前页面的全局变量,可以使用$GLOBALS数组。该数…

    other 2023年7月28日
    00
  • 微信小程序 modal组件详细介绍

    一、概述 在微信小程序的界面设计中,弹出式对话框一般使用modal组件实现。Modal是指类似于弹窗这样的对话框,具有浮动在页面上显示的特点,通常用于一些重要的信息展示、用户操作确认或是表单填写等场景。modal组件是微信小程序提供的快速实现方式,开发者可以使用微信提供的API快速定制自己的modal组件样式和内容。 二、使用方法 使用modal组件,需要在…

    other 2023年6月27日
    00
  • Win11电脑开机蓝屏怎么修复? win11蓝屏的多种解决办法

    Win11电脑开机蓝屏怎么修复? 当你在Win11电脑开机时遇到蓝色屏幕错误,通常会伴随着错误代码,这意味着系统可能遇到了无法解决的问题,需要进行修复。下面是多种解决方法: 解决方法一:检查硬件 首先要做的是检查硬件。如果配件有问题,可能会导致蓝屏问题。以下是一些常见的硬件问题和解决方法: 内存问题:打开计算机,按下F2键或Del键进入BIOS设置。然后在”…

    other 2023年6月20日
    00
  • Windows下实现简单的libevent服务器

    一、准备工作 安装MinGW和MSYS,并将其加入系统环境变量中; 安装libevent,下载地址为:https://github.com/libevent/libevent/releases; 在libevent的根目录下执行以下命令: ./configure –disable-shared make make install 二、编写服务器代码 在接下…

    other 2023年6月27日
    00
  • SpringBoot中mysql的驱动依赖问题小结

    SpringBoot中MySQL的驱动依赖问题小结 在SpringBoot中使用MySQL数据库时,我们需要添加相应的驱动依赖。本文将详细讲解SpringBoot中MySQL的驱动依赖问题,并提供两个示例说明。 1. 添加MySQL驱动依赖 在SpringBoot项目的pom.xml文件中,我们需要添加MySQL驱动依赖。可以使用以下代码将MySQL驱动添加…

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