您的位置:首页 > 理论基础 > 数据结构算法

《数据结构实战》将后缀表达式变成表达式树------二叉树的应用

2017-05-25 15:28 351 查看
编译原理中对于表达式的管理,前面已经有如何将中缀表达式转为后缀表达式算法了,原理同计算后缀表达式同理,为简单起见,操作符都是简单的二元表达式操作符。因此遇到操作数就形成一个叶子节点,并压栈,遇到操作符,则从栈中取两个节点,形成一颗新的树,并进行压栈。最后从栈中取出的为最终的表达式树。

代码如下:

// 由后缀表达式转换为表达式树

#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>

struct TreeNode
{
char cOperator;
int nData;
TreeNode* lTree;
TreeNode* rTree;
TreeNode()
{
cOperator = 0;
nData = 0;
lTree = NULL;
rTree = NULL;
}
};

std::vector<char> g_vectOperators;

void InitOperators() // 加载操作符
{
char* strOperators = { "+-*/" };
for (int i = 0; i < strlen(strOperators); i++)
g_vectOperators.push_back(*(strOperators + i));
}

TreeNode* EndExpressToTree(char* strExpress) // 后缀表达式转换为表达式树
{
if (*strExpress == 0)
return NULL;
std::stack<TreeNode*> stackExpressNode;
while (*strExpress != 0)
{
auto iter = std::find_if(g_vectOperators.begin(), g_vectOperators.end(), [=](char cOperator) { return cOperator == *strExpress; });
if (iter != g_vectOperators.end()) // 出栈
{
TreeNode* pNode = new TreeNode;
TreeNode* pTemp = stackExpressNode.top();
pNode->rTree = pTemp;
stackExpressNode.pop();
pTemp = stackExpressNode.top();
pNode->lTree = pTemp;
stackExpressNode.pop();
pNode->cOperator = *strExpress;
// 新节点压栈
stackExpressNode.push(pNode);
}
else // 是操作数
{
TreeNode* pNode = new TreeNode;
pNode->nData = *strExpress - 48;
stackExpressNode.push(pNode);
}
strExpress++;
}
if (stackExpressNode.empty())
return NULL;
else
{
TreeNode* pNode = stackExpressNode.top();
stackExpressNode.pop();
return pNode;
}
}

void DeleteNode(TreeNode*& pNode)
{
if (!pNode)
return;
DeleteNode(pNode->lTree);
DeleteNode(pNode->rTree);
delete pNode;
pNode = NULL;
}

int main()
{
InitOperators();
TreeNode* pNode = EndExpressToTree("12+345+**");
DeleteNode(pNode);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 c++ 二叉树