当前位置: 首页 > 知识库问答 >
问题:

使用堆栈和二叉树c构建表达式树

嵇星海
2023-03-14

我得到了一个包含运算符、、*、和括号的算术公式(这可能会改变运算符的自然优先级,也可能不会改变)。例如:a/b f–(c d)*e–a*c。我被要求使用堆栈(实现为链表)来跟踪操作数和运算符:我的程序应该如何工作的示例如下:

  • 读取、推送操作数堆栈
  • 读取/推送运算符堆栈
  • 读取b,推送操作数堆栈
  • Read:的优先级低于/,因此:
    • 从操作数堆栈中弹出2个操作数(a和b)
    • 弹出/来自运算符堆栈
    • 创建子树并推送操作数堆栈
    • 运算符堆栈为空,请按它
    • 从操作数堆栈中弹出2个操作数

    我难以理解的问题是如何区分操作数的优先级!

    以下是我编写的代码的不完整版本:

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    
    typedef struct btnode Btree;
    typedef struct node s_Node;
    
    struct btnode {
        char info; 
        Btree *left; 
        Btree *right;
    };
    
    
    struct node {
        char element;
        s_Node*next;
    }; 
    
    typedef struct{
        s_Node *top_stack;
    } stack_t; 
    
    int IsOperator(char c);
    
    main () {
        FILE* fp;
        stack_t operands;
        stack_t operators;
        char c;
        operands=NewStack();
        operators=NewStack();
        fp= fopen ("Myfile.txt", "r");
        if (fp== NULL)
            printf ("   FILE COULD NOT BE OPENED");
        else
        {
            c=getc(fp);
            while (!feof (fp))
            {
                if ( c== ' ');
                else 
                {
                    printf ("Here is your character: %c\n", c);
                    if (IsOperator (c))
                        Push (c, &operands);
                    else if ( isalpha (c))
    
    
                }
            c=getc(fp);
            }
        }
    }
    
    int IsOperator(char c)
    {   
        switch(c)
        {
            case '+':
            case '-':
            case '/':
            case '*':
            return 1;
            default:
            return 0;
        }
    } 
    
    stack_t NewStack()
    {
        stack_t *n_stack;
        n_stack=(stack_t*)malloc(sizeof(stack_t));
        n_stack->top_stack=NULL;
        return (*n_stack);  
    }
    
    int Push(char e, stack_t *q)
    {       
        s_Node *nn;
        nn= (s_Node*)malloc(sizeof(s_Node));
    
        if(Full(*q))
        {
            printf("\n\t Stack is Full !! \n\n");
            return 0;   // return 0 if enstack NOT successful
        }
        else 
        { 
            nn->element=e; // Storing the elemnt read inside the the new node
            nn->next=q->top_stack; // Pointing the new node to the top of the stack
            q->top_stack=nn; // Changing the top of the stack
            return 1;
        }
    }
    

    提前谢谢你!

共有1个答案

何灿
2023-03-14

对于正在使用的算法,操作数没有优先级。但在自底向上的shift-reduce解析器中,它确实具有优先级,正如@WhozCraig在下面这篇文章的评论中所说的那样。

操作数始终被推入操作数堆栈,并将弹出2,然后使用运算符进行计算,然后作为单个操作数再次推入操作数堆栈。

对于您的公式:a/b f–(c d)*e–a*c

>

  • a
  • 推送到操作数堆栈
  • 操作数:a
  • 接线员:

    /

    操作员:/

    B

    操作员:/

    接线员:

    f

    接线员:

    -

    接线员:-

    接线员:-(

    C

    接线员:-(

    操作员:-(

    D

    操作员:-(

    )

    接线员:-

    *

    接线员:-*

    E

    接线员:-*

    -

    接线员:-

    A.

    接线员:-

    *

    接线员:-*

    C

    接线员:-*

    行结束

    结果:(a/b)f)-(c d)*e)-(a*c))

  •  类似资料:
    • 问题内容: 我必须在Java中创建一个算术评估器。为此,我必须在二叉树中解析一个代数表达式,然后计算并返回结果。因此,对于第一步,我如何解析二叉树中的表达式?我知道理论,但是我的问题是如何用Java做到这一点。 但是我缺少基本的技巧或方法。我知道如何创建节点(我有一个带有returnNodeValue,isLeaf,isDoubleNode,isSingleNode等方法的类),但我认为我需要一种

    • 我正在为我的一堂计算机科学课开发一个计算后缀表达式结果的程序。该程序使用堆栈ADT来实现这一点。 我已经编写了程序,但相信可能会有错误,因为一些表达式的结果不正确。我不确定我的错误在哪里。 此外,当输入文件为空时,程序将生成一个值32767。那是从哪里来的? 表达式:34+3*值=21。 主程序:

    • 我花了几个小时试图弄清楚为什么它不会在最后打印根节点。 它无法

    • 本文向大家介绍在C ++中将三元表达式转换为二叉树,包括了在C ++中将三元表达式转换为二叉树的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论将三元表达式转换为二叉树的程序。 为此,我们将提供一个三元表达式。我们的任务是根据可能的各种路径(选择),以二叉树的形式转换给定的表达式。 示例 输出结果

    • 问题内容: 我正在构造一个二叉树。让我知道这是否是正确的方法。如果没有,请告诉我怎么做?我在构建通用二进制树的代码已找到的地方找不到合适的链接。BST的每个地方都已编码。 这是我要制作的二叉树。我应该能够进行所有的树遍历。 问题答案: 我认为这是您要寻找的:

    • 我正在将一些较旧的Boost regex代码转换为C++11的过程中,我在一个测试用例中偶然发现了一个问题。下面是一个使用std::regex导致堆栈溢出异常的场景,但使用boost::regex可以很好地工作。我没有更改正则表达式模式,并且已经验证了该模式是我想要的。似乎是这个特定的字符串输入片段导致了堆栈溢出。使用VS2012,x64调试生成: