| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 736 人关注过本帖
标题:二叉树的表达式求解
只看楼主 加入收藏
long361800
Rank: 2
等 级:论坛游民
帖 子:33
专家分:37
注 册:2010-8-23
结帖率:90%
收藏
已结贴  问题点数:2 回复次数:4 
二叉树的表达式求解
#include <stdio.h>
#include <malloc.h>

#define   MaxSize    20
#define   ElemType   char

typedef struct node
{
    ElemType       data;                /*数据元素*/
    struct node    *lchild;        /*指向左孩子*/
    struct node    *rchild;        /*指向右孩子*/
} BTNode;


typedef  struct
{
    BTNode    *data[MaxSize];
    int       top;              //栈顶指针
} SqStack1;


typedef  struct
{
    ElemType  data[MaxSize];
    int       top;              //栈顶指针
} SqStack2;

SqStack1   szz;
SqStack2   zmz;

void CLeafNode(BTNode *&T,char ch);
void CSubTree(BTNode *&T,char c);

void CreatBTNode(BTNode *&T,char *exp)
{
    zmz.top=-1;      //初始化栈顶
    szz.top=-1;
    T=NULL;
    while(*exp!='\0')
    {
        switch(*exp)
        {
        case '(':                /*判定为左括号*/
            zmz.top++;
            zmz.data[zmz.top]=*exp;
            exp++;                /*继续扫描其他字符*/
            break;
        case ')':                /*判定为右括号*/
                while(zmz.data[zmz.top]!='(')
                {
                 CSubTree(T,zmz.data[zmz.top]);
                 zmz.top--;   
                }
                zmz.top--;     /*将(退栈*/
                exp++;                /*继续扫描其他字符*/
                break;
        case '+':                /*判定为加或减号*/
        case '-':
            while (zmz.top!=-1 && zmz.data[zmz.top]!='(')
            {    /*将栈中'('前面的运算符退栈并存放到postexp中*/
                CSubTree(T,zmz.data[zmz.top]);    //建二叉子树并入栈
                zmz.top--;
            }
            zmz.top++;zmz.data[zmz.top]=*exp; /*将'+'或'-'进栈*/
            exp++;                /*继续扫描其他字符*/
            break;
        case '*':                /*判定为'*'或'/'号*/
        case '/':
            while (zmz.data[zmz.top]=='*' || zmz.data[zmz.top]=='/')
            {    /*将栈中'*'或'/'运算符依次出栈并存放到postexp中*/
                CSubTree(T,zmz.data[zmz.top]);    //建二叉子树并入栈
                zmz.top--;
            }
            zmz.top++;zmz.data[zmz.top]=*exp; /*将'*'或'/'进栈*/
            exp++;                /*继续扫描其他字符*/
            break;
        case ' ':break;            /*过滤掉空格*/
        default:                /*处理数字字符*/
                if(*exp>='0' && *exp<='9') /*判定为数字*/   
                CLeafNode(T,*exp);   //建立叶子结点
                exp++;
                break;
        }
    }//while
}


/**********************建立叶子结点**************************/

void CLeafNode(BTNode *&T,char ch)
{
    T=(BTNode *)malloc(sizeof(BTNode));
    T->data=ch;
    T->lchild=T->rchild=NULL;
    szz.top++;
    szz.data[szz.top]=T;   //将叶子结点指针入栈
}

/**********************建立子树**************************/

void CSubTree(BTNode *&T,char c)
{
    T=(BTNode *)malloc(sizeof(BTNode));
    T->data=c;
    T->rchild=szz.data[szz.top];
    szz.top--;
    T->lchild=szz.data[szz.top];
    szz.data[szz.top]=T;  //将子树的根结点进栈
}


/**********************输出二叉树**************************/

void DispBTNode(BTNode *b)    /*以括号表示法输出二叉树*/
{
    if (b!=NULL)
    {
        printf("%c",b->data);
        if (b->lchild!=NULL || b->rchild!=NULL)
        {
            printf("(");
            DispBTNode(b->lchild);
            if (b->rchild!=NULL) printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }
} //DispBTNode


void main()
{
    char string[20];
    BTNode  *b;
    printf("请输入一个四则运算表达式:");
    gets(string);
    CreatBTNode(b,string);
    printf("生成的二叉树为:");
    DispBTNode(b);
    printf("\n");
    getchar();
    getchar();
}

这个程序输不出正确的结果,错在哪里??望解答一下。。。。。


搜索更多相关主题的帖子: include 表达式 二叉树 元素 
2011-08-11 15:49
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:1 
这个分  和 你的代码 不成功比例......
2011-08-11 18:11
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:1 
太长了
2011-08-11 21:23
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
回复 楼主 long361800
不清楚 你这程序 到底是实现个什么东西

需求不明确      
2011-08-11 22:35
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:1 
程序代码:
#include <stdio.h>
#include <malloc.h>

#define   MaxSize    20
typedef   char    ElemType;

typedef struct node 
{
    ElemType       data;                /*数据元素*/
    struct node    *lchild;        /*指向左孩子*/
    struct node    *rchild;        /*指向右孩子*/
} BTNode;


typedef  struct
{
    BTNode    *data[MaxSize];
    int       top;              //栈顶指针
} SqStack1;


typedef  struct
{
    ElemType  data[MaxSize];
    int       top;              //栈顶指针
} SqStack2;

SqStack1   szz;
SqStack2   zmz;

void CLeafNode(BTNode *&T,char ch);
void CSubTree(BTNode *&T,char c);

void CreatBTNode(BTNode *&T,char *exp)
{
    zmz.top=-1;      //初始化栈顶
    szz.top=-1;
    T=NULL;
    while(*exp!='\0')
    {
        switch(*exp)
        {
        case '(':                /*判定为左括号*/
            zmz.top++;
            zmz.data[zmz.top]=*exp;
            exp++;                /*继续扫描其他字符*/
            break;
        case ')':                /*判定为右括号*/
                while(zmz.data[zmz.top]!='(')
                {
                    CSubTree(T,zmz.data[zmz.top]);
                    zmz.top--;    
                }
                zmz.top--;     /*将(退栈*/
                exp++;         /*继续扫描其他字符*/
                break;
        case '+':                /*判定为加或减号*/
        case '-':
            while (zmz.data[zmz.top]=='*' || zmz.data[zmz.top]=='/')
            {   /*将栈中'*'或'/'运算符依次出栈并存放到postexp中*/
                CSubTree(T,zmz.data[zmz.top]);    //建二叉子树并入栈
                zmz.top--;
            }
            zmz.top++;
            zmz.data[zmz.top]=*exp; /*将'+'或'-'进栈*/
            exp++;                /*继续扫描其他字符*/
            break;
        case '*':                /*判定为'*'或'/'号*/
        case '/':
            while (zmz.data[zmz.top]=='*' || zmz.data[zmz.top]=='/')
            {   /*将栈中'*'或'/'运算符依次出栈并存放到postexp中*/
                CSubTree(T,zmz.data[zmz.top]);    //建二叉子树并入栈
                zmz.top--;
            }
            zmz.top++;
            zmz.data[zmz.top]=*exp; /*将'*'或'/'进栈*/
            exp++;                /*继续扫描其他字符*/
            break;
        case ' ':break;            /*过滤掉空格*/
        default:                /*处理数字字符*/
                if(*exp>='0' && *exp<='9') /*判定为数字*/    
                    CLeafNode(T,*exp);   //建立叶子结点
                while (zmz.data[zmz.top]=='*' || zmz.data[zmz.top]=='/')
                {    /*将栈中'*'或'/'运算符依次出栈并存放到postexp中*/
                    CSubTree(T,zmz.data[zmz.top]);    //建二叉子树并入栈
                    zmz.top--;
                }
                exp++;
                break;
        }
    }//while
    while(zmz.top!=-1)
    {
        CSubTree(T,zmz.data[zmz.top]);    //建二叉子树并入栈
            zmz.top--;
    }
}


/**********************建立叶子结点**************************/

void CLeafNode(BTNode *&T,char ch)
{
    T=(BTNode *)malloc(sizeof(BTNode));
    T->data=ch;
    T->lchild=T->rchild=NULL;
    szz.top++;
    szz.data[szz.top]=T;   //将叶子结点指针入栈
}

/**********************建立子树**************************/

void CSubTree(BTNode *&T,char c)
{
    T=(BTNode *)malloc(sizeof(BTNode));
    T->data=c;
    T->rchild=szz.data[szz.top];
    szz.top--;
    T->lchild=szz.data[szz.top];
    szz.data[szz.top]=T;  //将子树的根结点进栈 
}


/**********************输出二叉树**************************/

void DispBTNode(BTNode *b)    /*以括号表示法(广义表)输出二叉树*/
{
    if (b!=NULL)
    {
        printf("%c",b->data);
        if(b->lchild!=NULL || b->rchild!=NULL)
        {
            printf("(");
            DispBTNode(b->lchild);
            if(b->rchild!=NULL) 
                printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }
} //DispBTNode


void main()
{
    char string[20];
    BTNode  *b;
    printf("请输入一个四则运算表达式:");
    gets(string);
    CreatBTNode(b,string);
    printf("生成的二叉树为:");
    DispBTNode(b);
    printf("\n");
    return ;
}

注意输入的表达式计算数字只能是0~9

A real warrior never quits.
2011-08-12 15:13
快速回复:二叉树的表达式求解
数据加载中...
 
   



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

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