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


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

    资源获取:

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

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

    核心数据结构

    1. 栈的实现

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

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

    详细功能解析

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

    1. string zhuanhuan(const string& infix) { //方法都大差不差
    2. string postfix;
    3. Stack operatorStack;
    4. for (char ch : infix) {
    5. if (isdigit(ch)) {
    6. postfix += ch;
    7. }
    8. else if (ch == '(') {
    9. operatorStack.Push(ch);
    10. }
    11. else if (ch == ')') {
    12. while (......略......) {
    13. ......略......
    14. }
    15. if (......略......) {
    16. ......略......
    17. }
    18. }
    19. else {
    20. while (!operatorStack.IsEmpty() && operatorStack.Top() != '(' &&
    21. ......略......
    22. }
    23. operatorStack.Push(ch);
    24. }
    25. }
    26. while (!operatorStack.IsEmpty()) {
    27. ......略......
    28. }
    29. return postfix;
    30. }

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

    效果图如下:

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

    1. void Delete(int value) { //删除指定元素
    2. ......略......
    3. while (!IsEmpty()) {
    4. int topValue = Top();
    5. Pop();
    6. if (topValue == value) {
    7. ......略......
    8. }
    9. else {
    10. ......略......
    11. }
    12. }
    13. if (!found) {
    14. cerr << "未找到要删除的元素" << endl;
    15. }
    16. else {
    17. ......略......
    18. }
    19. while (!reversedValues.empty()) {
    20. ......略......
    21. cout << endl;
    22. }
    23. }
    24. };

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

    效果图如下:

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

    1. double EvaluatePostfix(const std::string& postfix) {
    2. std::stack<double> operandStack;
    3. for (char ch : postfix) {
    4. if (std::isdigit(ch) || (ch == '.')) {
    5. ......略......
    6. }
    7. else if (ch == ' ') {
    8. #####略######
    9. }
    10. else { //俩俩的算,运算之后再次push进去
    11. ######略#######
    12. switch (ch) {
    13. case '+':
    14. operandStack.push(a + b);
    15. break;
    16. case '-':
    17. operandStack.push(a - b);
    18. break;
    19. case '*':
    20. operandStack.push(a * b);
    21. break;
    22. case '/':
    23. operandStack.push(a / b);
    24. break;
    25. }
    26. }
    27. }
    28. return operandStack.top();
    29. }

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

    4.其他函数:

    4.1. Stack Pushand()
    1. Stack Pushand() {
    2. Stack stack;
    3. // ... 省略部分代码 ...
    4. return stack;
    5. }
    • 用户输入堆栈数据个数,并逐个输入数字,构建堆栈。
    • 输出堆栈中的值,并返回构建好的堆栈。
    4.2. void Printf()void Printf_2()
    1. void Printf() {
    2. // ... 省略部分代码 ...
    3. }
    4. void Printf_2() {
    5. // ... 省略部分代码 ...
    6. }
    • Printf:打印主菜单,显示功能选项。
    • Printf_2:打印功能结束提示。
    4.3. void choice_1()void choice_2()
    1. void choice_1() {
    2. // ... 省略部分代码 ...
    3. }
    4. void choice_2() {
    5. // ... 省略部分代码 ...
    6. }
    • choice_1:执行中缀表达式转后缀表达式的操作,输出后缀表达式和计算结果。
    • choice_2:执行删除堆栈中元素的操作,输出删除后的堆栈。

    主函数如下:

    1. int main() {
    2. int choice;
    3. do {
    4. Printf();
    5. cout << "请输入选择:";
    6. cin >> choice;
    7. switch (choice) {
    8. case 1:
    9. choice_1();
    10. break;
    11. case 2:
    12. choice_2();
    13. break;
    14. case 0:
    15. break;
    16. default:
    17. cout << "无效的选择,请重新输入" << endl;
    18. Printf_2();
    19. }
    20. } while (choice != 0);
    21. return 1111111111111111111;
    22. }

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

    1. 堆栈相关资源:

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

    3. C++ 表达式计算:

    4. 其他相关资源:

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

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

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

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

  • 相关阅读:
    Spring Authorization Server入门 (十八) Vue项目使用PKCE模式对接认证服务
    screen命令
    Upload-labs 1~15 通关详细教程
    mac vscode xdebug 调试moodle
    Spring Boot : ORM 框架 JPA 与连接池 Hikari
    我们来用Unity做个2D像素boss战
    Ubuntu20.4搭建基于iRedMail的邮件服务器
    podman创建helloWord镜像实例-参考docker
    写给前端程序员的C语言
    25K测试老鸟7年经验的面试心得,四种公司、四种问题…
  • 原文地址:https://blog.csdn.net/qq_72290695/article/details/134485914