| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1523 人关注过本帖
标题:用二叉树怎么可以实现表达式的计算 帮帮忙写下吧
只看楼主 加入收藏
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
info就是union类型的,是联合体类型。
代码都是正确通过运行的。你可以参照思想。
2009-07-29 13:52
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
pow()函数计算的是乘方,用于处理表达式中的^运算符。
2009-07-29 13:54
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
以下的代码是表达式二叉树创建的函数,你参考吧:

//////////////////////////////////////////////////
//CreExpBinTree()公有成员函数
//通过当前的表达式来创建对应的表达式二叉树
//////////////////////////////////////////////////
void Expression::CreExpBinTree()
{
    LinkedStack<char> Opstk;     //运算符栈
    Opstk.Push('#');             //左优先级最高的运算符入栈
    LinkedStack<BinTreeNode<ExpNode>*>
        Pointstk;                //二叉树的结点指针栈
    BinTreeNode<ExpNode>* pTree; //表达式二叉树的结点指针变量
    ExpNode* ptr=Exp->link;      //遍历单链表的指针
    while(ptr!=NULL)
    {
        if(ptr->etype==0)        //如果遇到的是数据结点
        {
            pTree=new            //新建一个表达式二叉树的结点
                BinTreeNode<ExpNode>;
            pTree->data=*ptr;    //数据域的拷贝
            Pointstk.Push(pTree);//把新建的数据结点
            ptr=ptr->link;       //继续遍历下个结点
        }
        else                     //如果遇到的是运算符
        {
            char lop;
            Opstk.getTop(lop);   //获取栈顶的运算符
            char rop=ptr->info.op;
            if(leftp(lop)<       //但前运算符要压栈了
                rightp(rop))
            {
                Opstk.Push(rop);
                ptr=ptr->link;
            }
            else
            {
                BinTreeNode<ExpNode>* x;
                BinTreeNode<ExpNode>* y;
                char op;         
                BinTreeNode<ExpNode>* res;
                Opstk.Pop(op);   //从堆栈弹出的运算符
                if(op=='#')
                {
                    Pointstk.getTop(res);
                    root=res;    //返回最终的二叉树的根结点
                    return;
                };
                if(op!='(')      //如果弹出的不是左括号(作括号运算没有操作数)
                {                //得到右左子结点的指针
                    Pointstk.Pop(y);
                    Pointstk.Pop(x);
                    res=new BinTreeNode<ExpNode>;
                    res->data.etype=1;
                    res->data.info.op=op;
                    res->leftChild=x;
                    res->rightChild=y;
                    Pointstk.Push(res);
                }
                else
                    ptr=ptr->link;
            };
        };
    };
};
///////////////////////////////CreExpBinTree()函数
2009-07-29 13:57
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
还有结点定义:

//////////////////////////////////////////////////
//ExpNode结构  表达式元素的结点
//这个结点要么是数据此时etype=0,
//要么是运算符,此时etyp=1;
//////////////////////////////////////////////////
struct ExpNode
{
    int etype;          //类型,0:数据,1:运算符
    union content       //内容的联合体
    {
        double data;    //数据
        char op;        //运算符
    } info;
    ExpNode* link;      //链接指针
    ExpNode()           //默认构造函数
    {etype=0;info.data=0;link=NULL;};
};
///////////////////////////////////ExpNode结构结束
2009-07-29 13:57
中国
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2009-1-4
收藏
得分:0 
回复 13楼 geninsf009
LinkedStack<char> Opstk; //(char)是强制转换吗?
LinkedStack<BinTreeNode<ExpNode>*>//这个结构怎么理解呢?堆栈后面又有二叉树然后又有结构体,这个变量到底是什么呢?可以这样定义啊?
if(leftp(lop)<  rightp(rop)//但前运算符要压栈了?
pTree=new   BinTreeNode<ExpNode>;//新建一个表达式二叉树的结点 ?java中才这样用new新建吧。
2009-07-30 15:57
中国
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2009-1-4
收藏
得分:0 
回复 14楼 geninsf009
ExpNode()           //默认构造函数
    {etype=0;info.data=0;link=NULL;};java中的吧,C也这样吗??????
2009-07-30 15:57
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
我用的是c++,例如LinkedStack<char>的
东西是类模板。
2009-07-30 20:02
快速回复:用二叉树怎么可以实现表达式的计算 帮帮忙写下吧
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015902 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved