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

来源:互联网 发布:淘宝买的人参 编辑:程序博客网 时间:2024/06/02 03:32

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

代码如下:

// 由后缀表达式转换为表达式树#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;}


阅读全文
0 0