编写一个程序,使用堆栈将表达式 a b + c d e + * * 转换为表达式树

Write a program, which converts the expression a b + c d e + * * into an expression tree using stack.

本文关键字:表达式 转换 堆栈 一个 程序      更新时间:2023-10-16

说明我不知道如何完成这项任务....但我只是创建了一个树并输入值。任何人都可以帮我完成这项任务...堆栈也是节点类型,我们必须推送像 ab+ 这样的运算符的值,所以我们将 a 作为节点推送,然后 b 作为节点,当 + 到来时,我们制作一棵树,a 和 b 将是它的叶节点。

.法典

#include<iostream>
using namespace std;
class Node{
public:
    int data;
    Node *left;
    Node *right;
    Node()
    {
        data = 0;
        left = NULL;
        right = NULL;
    }
};
class Tree
{
    Node *root;
    void insert(int d, Node *node)
    {
        if (d < node->data)
        {
            if (node->left == NULL)
            {
                Node *leaf = new Node();
                leaf->data = d;
                node->left = leaf;
            }
            else
            {
                insert(d, node->left);
            }
        }
        else
        {
            if (node->right == NULL)
            {
                Node *leaf = new Node();
                leaf->data = d;
                node->right = leaf;
            }
            else
            {
                insert(d, node->right);
            }
        }
    }
    void inOrderDisplay(Node *subRoot)
    {
        if (subRoot != NULL)
        {
            inOrderDisplay(subRoot->left);
            cout << subRoot->data << "  ";
            inOrderDisplay(subRoot->right);
        }
    }
    void postOrderDisplay(Node *subRoot)
    {
        if (subRoot != NULL)
        {
            postOrderDisplay(subRoot->left);
            postOrderDisplay(subRoot->right);
            cout << subRoot->data << "  ";
        }
    }
    void preOrderDisplay(Node *subRoot)
    {
        if (subRoot != NULL)
        {
            cout << subRoot->data << "  ";
            preOrderDisplay(subRoot->left);
            preOrderDisplay(subRoot->right);
        }
    }
    void deleteSubtree(Node *subRoot)
    {
        if (subRoot != NULL)
        {
            deleteSubtree(subRoot->left);
            deleteSubtree(subRoot->right);
            cout << "ndeleting: " << subRoot->data;
            delete subRoot;
            subRoot = NULL;
        }
    }
public:
    Tree()
    {
        root = NULL;
    }
    ~Tree()
    {
        deleteAll();
    }
    void insert(int d)
    {
        if (root == NULL)
        {
            Node *leaf = new Node();
            leaf->data = d;
            root = leaf;
        }
        else
        {
            insert(d, root);
        }
    }
    void inOrderDisplay()
    {
        inOrderDisplay(root);
    }
    void postOrderDisplay()
    {
        postOrderDisplay(root);
    }
    void preOrderDisplay()
    {
        preOrderDisplay(root);
    }
    void deleteAll()
    {
        deleteSubtree(root);
    }
};

.主类:

#include<iostream>
#include"task1.h"
using namespace std;
void main()
{
    Tree tree;
    tree.insert(10);
    tree.insert(6);
    tree.insert(14);
    tree.insert(5);
    tree.insert(8);
    tree.insert(11);
    tree.insert(18);
    cout << endl;
    system("pause");
    //tree.deleteAll();
}

根据你在这里的代码,你只有一个void insert(int d, Node *node)函数,没有void insert(operator o, Node *node)函数。

我认为这表明您在这里错过了一个重要的观点。树中的每个节点都可以是整数(如您所做的那样)或运算符。在这两种情况下,我都称它为字符串。每个不是叶的节点都必须是运算符,并且所有叶子都必须是整数(或在本例中表示运算符/整数的字符串)。

然后,遍历输入,前三项应如下所示:

    +
   / 
  a   b

下一步是构建更多的子树(不确定你拥有的输入的定义),将它们保留在你的堆栈中,然后构建更多的树内部节点。

因此,如果我上面显示的树称为Tree(+)(为了便于使用),并且初始堆栈是[a,b,+,c,d,e,*,*],那么在一次迭代之后,您将拥有[Tree(+),c,d,e,*,*]并从那里继续。