C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素

news2025/1/16 20:14:21

       在这篇博客中,我们将深入分析一个使用C++编写的栈和表达式计算程序。该程序不仅实现了基本的栈操作,还提供了中缀表达式转后缀表达式和删除堆栈中的元素等实用功能。通过逐一讲解每个函数的功能,我们将更全面地理解这个程序的实现。

资源获取:

  • 官方途径:点击博主头像,主页下载资源,需花费积分!

  • 个人途径:公众号:每日推荐系列,回复【表达式转换】免费获取!

核心数据结构

1. 栈的实现

struct Node { ... };
struct Stack { ... };
  • Node结构:表示栈的元素,包含一个整数类型的数据和指向下一个结点的指针。

  • Stack结构:自定义栈,包含栈顶指针和栈的大小。提供了基本的入栈、出栈、获取栈顶元素、判断栈是否为空等操作。

详细功能解析

1. 中缀表达式转后缀表达式(主要功能函数 ①

string zhuanhuan(const string& infix) {   //方法都大差不差
    string postfix;
    Stack operatorStack;
    for (char ch : infix) {
        if (isdigit(ch)) {
            postfix += ch;
        }
        else if (ch == '(') {
            operatorStack.Push(ch);
        }
        else if (ch == ')') {
            while (......略......) {
                 ......略......
            }
            if (......略......) {
                ......略......
            }
        }
        else {
            while (!operatorStack.IsEmpty() && operatorStack.Top() != '(' &&
                ......略......
            }
            operatorStack.Push(ch);
        }
    }
    while (!operatorStack.IsEmpty()) {
        ......略......
    }
    return postfix;
}

主要函数过程是遍历中缀表达式,使用栈辅助转换。数字直接输出,左括号入栈,右括号弹出栈元素直到遇到左括号,运算符按照优先级处理。

效果图如下:

2. 删除堆栈中的元素(主要功能函数 ②

    void Delete(int value) {  //删除指定元素
        ......略......
        while (!IsEmpty()) {
            int topValue = Top();
            Pop();

            if (topValue == value) {
                ......略......
            }
            else {
                ......略......
            }
        }
        if (!found) {
            cerr << "未找到要删除的元素" << endl;
        }
        else {
           
            ......略......
            }
            while (!reversedValues.empty()) {
                ......略......
            cout << endl;
        }
    }

};

删除堆栈中的元素,使用临时栈将不需要删除的元素暂存,输出删除的元素,最终恢复原始栈的值。

效果图如下:

3. 表达式计算(非主要功能)


double EvaluatePostfix(const std::string& postfix) {   
    std::stack<double> operandStack;

    for (char ch : postfix) {   
        if (std::isdigit(ch) || (ch == '.')) {

        ......略......

        }
        else if (ch == ' ') {
            #####略######
        }
        else {    //俩俩的算,运算之后再次push进去

            ######略#######

            switch (ch) {
            case '+':
                operandStack.push(a + b);
                break;
            case '-':
                operandStack.push(a - b);
                break;
            case '*':
                operandStack.push(a * b);
                break;
            case '/':
                operandStack.push(a / b);
                break;
            }
        }
    }

    return operandStack.top();
}

遍历后缀表达式,使用栈存储操作数,遇到运算符则弹出栈顶两个元素进行计算,将结果压入栈中。

4.其他函数:

4.1. Stack Pushand()
Stack Pushand() {
    Stack stack;
    // ... 省略部分代码 ...
    return stack;
}
  • 用户输入堆栈数据个数,并逐个输入数字,构建堆栈。
  • 输出堆栈中的值,并返回构建好的堆栈。
4.2. void Printf()void Printf_2()
void Printf() {
    // ... 省略部分代码 ...
}

void Printf_2() {
    // ... 省略部分代码 ...
}
  • Printf:打印主菜单,显示功能选项。
  • Printf_2:打印功能结束提示。
4.3. void choice_1()void choice_2()
void choice_1() {
    // ... 省略部分代码 ...
}

void choice_2() {
    // ... 省略部分代码 ...
}
  • choice_1:执行中缀表达式转后缀表达式的操作,输出后缀表达式和计算结果。
  • choice_2:执行删除堆栈中元素的操作,输出删除后的堆栈。

主函数如下:

int main() {
    int choice;
    do {
        Printf();
        cout << "请输入选择:";
        cin >> choice;
        switch (choice) {
        case 1:
            choice_1();
            break;
        case 2:
            choice_2();
            break;
        case 0:
            break;
        default:
            cout << "无效的选择,请重新输入" << endl;
            Printf_2();
        }
    } while (choice != 0);
    
    return 1111111111111111111;
}

感谢分享这篇有关C/C++数据结构的文章,涵盖了栈的基本操作、中缀表达式转后缀表达式、删除堆栈中的元素以及表达式的计算等方面的内容。如果读者想深入学习相关主题,以下是一些额外的资源和知识点,以及网址链接:

1. 堆栈相关资源:

  • C++ 标准模板库 (STL) - stack:C++中标准库提供的堆栈容器的文档。
  • C++ 标准模板库 (STL) - vector:与堆栈有关的底层数据结构之一。
  • GeeksforGeeks - Stack Data Structure:GeeksforGeeks 上关于堆栈数据结构的详细教程和实现。

2. 中缀表达式转后缀表达式:

  • Shunting Yard Algorithm:维基百科上关于Shunting Yard算法的介绍。
  • 中缀表达式转后缀表达式算法:GeeksforGeeks 上的中缀到后缀的算法和实现。

3. C++ 表达式计算:

  • C++ 中的字符串流 (Stringstream):用于将字符串转换为其他数据类型,对表达式计算很有用。
  • C++ 中的 switch 语句:用于处理不同运算符的计算。

4. 其他相关资源:

  • C++ Primer (书籍):Stanley B. Lippman等人编写的 C++ 入门经典。
  • LeetCode:在线刷题平台,提供丰富的数据结构和算法问题,适合提高编程能力。

5. 相关知识点的网址链接:

  • C++ 中文网:提供了丰富的C++学习资源和实例。
  • Stack Overflow:程序员问答社区,可以在这里提问和查找与编程相关的问题。

希望这些资源能够帮助读者更深入地学习和理解C/C++数据结构及相关算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信(小程序开发): 解决播放音乐没有声音的情况 代码不报错的情况下依旧没有声音的解决方案

解决无声的问题 在此之前&#xff0c;确保代码能够正常执行哈&#xff01;发这个其实没什么&#xff0c;就是有些人光写代码不调试出现了这个问题 其实解决方法特别简单 第一步&#xff1a; 打开项目后&#xff0c;点击三个点&#xff0c;然后选择模拟操作 第二步&#xff…

nodejs微信小程序-慢性胃炎健康管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

rollout

构建 测试 代码扫描 打包 打镜像 推送镜像 部署应用 Rollout 是 Kubernetes 中用于管理部署应用的资源对象。它通过控制多个 ReplicaSets 对象的创建、缩放和更新&#xff0c;以实现无宕机升级和回滚应用程序版本的能力。 一般来说&#xff0c;在 Kubernetes 中&#xff0c;我…

NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!

之前分享过搭建可以与宝塔共存的一个 “魔法” 服务器状态监控应用 ——xui&#xff0c;支持 VmessWSTLS。 最近 Docker 视频出的比较多&#xff0c;前阵子又出现了宝塔国内版存在隐私泄露的问题&#xff0c;很多小伙伴其实都不用宝塔了&#xff0c;那么&#xff0c;在我们现在…

分支限界法(1)--旅行商问题

一、概述 有n个城市&#xff0c;旅行者要访问所有n个城市&#xff0c;最终回到起始点&#xff0c;假设起始点给定为1&#xff0c;城市间距离已知&#xff0c;求能够完成旅行的最短距离。题干如下图。 算法&#xff1a;分支限界法&#xff0c;使用队列进行bfs搜索。 二、代码 i…

AIGC 是通向 AGI 的那条路吗?

AIGC 是通向 AGI 的那条路吗&#xff1f; 目录 一、背景知识 1.1、AGI&#xff08;人工通用智能&#xff09; 1.1.1、概念定义 1.1.2、通用人工智能特质 1.1.3、通用人工智能需要掌握能力 1.2、AIGC 二、AIGC 是通向 AGI 的那条路吗&#xff1f; 三、当前实现真正的 A…

硬件工程师基础能力课

第一课时--基本定理、电阻、电容等 首先了解下面几个概念&#xff0c;基尔霍夫定理&#xff1a;KCL & KVL&#xff0c;叠加定理&#xff0c;戴维南定理&#xff08;电压源等效&#xff09;和诺顿定理&#xff08;电流源等效&#xff09;、奈奎斯特采样定理。 上面说的这些东…

SVG的viewBox、width和height释义, 示例及代码

svg的是没有边界的&#xff0c;svg画布只是用于展示svg世界中某一个范围的内容&#xff0c;而对于超过了svg画布范围的内容&#xff0c;则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。 ​ 我们可以通过viewBox来修改默认的显示配置&#…

组合模式 rust和java的实现

文章目录 组合模式介绍实现javarsut 组合模式 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计…

Flutter笔记:桌面端应用多窗口管理方案

Flutter笔记 桌面端应用多窗口管理方案 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134468587 【简介…

python算法例10 整数转换为罗马数字

1. 问题描述 给定一个整数&#xff0c;将其转换为罗马数字&#xff0c;要求返回结果的取值范围为1~3999。 2. 问题示例 4→Ⅳ&#xff0c;12→Ⅻ&#xff0c;21→XⅪ&#xff0c;99→XCIX。 3. 代码实现 def int_to_roman(num):val [1000, 900, 500, 400,100, 90, 50, 40…

vue项目中使用vant轮播图组件(桌面端)

一. 内容简介 vue使用vant轮播图组件(桌面端) 二. 软件环境 2.1 Visual Studio Code 1.75.0 2.2 chrome浏览器 2.3 node v18.14.0 三.主要流程 3.1 安装环境 3.2 添加代码 3.3 结果展示 四.具体步骤 4.1 安装环境 先安装包 # Vue 3 项目&#xff0c;安装最新版 Va…

Linux进程——exec族函数、exec族函数与fork函数的配合

exec族函数解析 作用 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 功能 在调用进程内部…

【Web】Ctfshow SSRF刷题记录1

核心代码解读 <?php $url$_POST[url]; $chcurl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resultcurl_exec($ch); curl_close($ch); ?> curl_init()&#xff1a;初始curl会话 curl_setopt()&#xff1a;会…

QCheckBox样式表

1、QCheckBox选择器和指示器类型 选择器类型描述QCheckBoxQCheckBox 的默认选择器。QCheckBox::indicatorQCheckBox 的指示器,即复选框的标记部分。QCheckBox::indicator:checkedQCheckBox 选中状态下的指示器。QCheckBox::indicator:uncheckedQCheckBox 未选中状态下的指示器…

神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!

分类 互联网 在 ChatGPT 问世之前&#xff0c;我们的编码方式很多时候都是面向搜索引擎编码&#xff0c;需要不断地进行搜索&#xff0c;然后复制粘贴&#xff0c;俗称复制粘贴工程师。 但是&#xff0c;随着ChatGPT的出现&#xff0c;这一切将彻底改变。 ChatGPT 是一种基于…

【漏洞复现】通达oa 前台sql注入

漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…

操作系统(五)| 文件系统上 结构 存取方式 文件目录 检索

文章目录 1 文件系统概述2 文件的结构与存取方式2.1 磁盘2.2 文件的物理结构2.2.1 连续结构2.2.2 链式结构2.2.3 索引结构 2.3 文件的存取方式 3 文件目录3.1 基本概念3.2 目录结构单级目录结构多级目录结构 3.3 文件目录检索3.3.1 目录检索文件寻址 3.4 文件目录的实现 1 文件…

CAS源码工程搭建记录

CAS源码工程搭建 1.下载2.gradle下载源改为阿里云&#xff0c;解决下载慢的问题3.解决保存 1.下载 git clone -b 5.3.x https://gitee.com/mirrors/CAS.git如果下载的是压缩包&#xff0c;导入工程会保存&#xff0c;因为builder.gradle的第20行开始有取git信息&#xff0c;如…

为关键信息基础设施安全助力!持安科技加入关保联盟

近日&#xff0c;中关村华安关键信息基础设施安全保护联盟发布了其新一批的会员单位&#xff0c;零信任办公安全代表企业持安科技成功加入&#xff0c;与联盟企业共同为关键信息基础设施提供各类支撑和保障。 中关村华安关键信息基础设施安全保护联盟由北京市科学技术委员会、中…