| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 502 人关注过本帖
标题:[求助]我的表达式的程序不能完全运行啊!!
只看楼主 加入收藏
hanqin
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-1-11
收藏
 问题点数:0 回复次数:1 
[求助]我的表达式的程序不能完全运行啊!!

请各位大哥大姐们帮帮忙啊
我这个是表达式求值的代码,根据前序输入建立二叉树以@结束,对其中的变量附值,然后中序输出,并且要添括号的要加括号,最后求出它的值
但程序给变量附值后就不能运行拉,不知道是哪里错拉
希望各位帮帮忙啊,本人不甚感激!!!


#include<iostream.h>
#include<stdio.h>
#define NULL 0
typedef struct node *pointer;
struct node{
char data;
pointer next,lchild,rchild;
};
typedef pointer BiTree;

typedef struct{
pointer front,rear;
}lkqueue;//链队列类型

void init_lkqueue(lkqueue *lq){ //初始化队列
pointer p;
p=new node; //申请头结点空间
p->next=NULL; //头结点next指针为空
lq->front=p; //头指针指向头结点
lq->rear=p; //尾指针指向头结点
}


char gethead_lkqueue(lkqueue *lq){
if(lq->rear==lq->front){
cout<<"队头,无队头可取!"<<endl;
return 0;
}
else
return lq->front->next->data;
}


void en_lkqueue(lkqueue *lq,char x){
pointer p;
p=new node; //申请新结点空间
p->data=x; //给新结点赋值
p->next=NULL; //新尾结点next指针为空
lq->rear->next=p; //原尾结点指向新结点
lq->rear=p; //新结点成为新尾结点
}


char de_lkqueue(lkqueue *lq){//出队,由x返回原队头值
pointer s;
char x;
if(lq->rear==lq->front){
cout<<"队空,不能出队!"<<endl;
return 0;
}
else {
s=lq->front->next;
x=s->data;
lq->front->next=s->next;
if(s->next==NULL)
lq->rear=lq->front;
delete s;
return x;
}
}


char OP[5]={'+','-','*','/','^'};
int In(char c,char *op)//比较字符是否为运算符,是则返回1,否则0
{
int i=0;
while(i<5)
if(c==op[i++]) return 1;
return 0;
}

int precede[5][5]={//检查运算符排序方法
2,2,2,2,2,
1,1,2,2,2,
1,1,2,2,1,
1,1,1,1,1,
1,1,1,1,1,
};

int Precede(char op,char c)//比较运算符的优先级
{
int pos_op;
int pos_c;
int i;
for(i=0;i<5;i++)
{
if(op==OP[i]) pos_op=i;
if(c==OP[i]) pos_c=i;
}
switch(precede[pos_op][pos_c])
{
case 1: return 1;
case 2: return 0;
default:return 0;
}
}


int CreateBiTree(BiTree t,BiTree T,lkqueue S)
{
char e=de_lkqueue(&S);
char E=e;
while (!(((e>='0')&&(e<='9'))||(In(e,OP))||(e=='@')))
{ //变量判断并赋值
cout<<endl;
cout<<"请给"<<e<<"赋上(0-9)的数字:";
cin>>e;
}
if (e!='@')//建立二叉树
{
t=new node;
T=new node;
t->data=e; T->data=E;
if (e>='0'&&e<='9')
{
t->lchild=NULL;
t->rchild=NULL;
T->lchild=NULL;
T->rchild=NULL;
}
CreateBiTree(t->lchild,T->lchild,S);//递归调用
CreateBiTree(t->rchild,T->rchild,S);
}
return 1;
}


void WriteMid(BiTree t)//中序输出
{
int r=0;int l=0;
if (t)
{
if (In(t->lchild->data,OP)&&
(Precede(t->data,t->lchild->data)))
{//添加括弧
l=1;cout<<"(";
}
WriteMid(t->lchild);
if(l) cout<<")";
cout<<t->data;
if (In(t->rchild->data,OP)&&
(Precede(t->data,t->rchild->data)))
{
r=1;
cout<<"(";
}
WriteMid(t->rchild);
if (r) cout<<")";

}
}

int Operate(int a,char P,int b)//运算函数,返回运算结果
{
int n,c;
switch(P)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
case '^':for(n=1,c=a;n<b;n++) {c*=a;
return c;}
default:return 0;

}
}

int Value(BiTree t,char tl,char tr)//字符转换并运算,返回结果
{
char a,b,P;
int A,B,V;
a=tl;
A=a-48;//转化为int型
b=tr;
B=b-48;
P=t->data;
if (In(a,OP))
A=Value(t->lchild,t->lchild->lchild->data,t->lchild->rchild->data);
if (In(b,OP))
B=Value(t->rchild,t->rchild->lchild->data,t->rchild->rchild->data);
V=Operate(A,P,B);//调用运算函数
return V;
}


void CompoundExpr(){}


void main()
{
char x='@'; int V;
lkqueue S; //创建结构体队列S,其成员是指针front和rear
BiTree t=NULL;
BiTree T=NULL; //定义跟结点t和T
init_lkqueue(&S); //初始化队列
en_lkqueue(&S,x); //x入队S
cout<<"请输入以@结尾的表达式:";
do//输入字符并且入队,当输入q时结束
{
cin>>x;
en_lkqueue(&S,x);
}
while(x!='@');
de_lkqueue(&S); //返回字符
CreateBiTree(t,T,S); //先序建立二叉树
cout<<"\n正常的表达式语句是:"<<endl;
WriteMid(T); //中序输出原表达式
cout<<endl;
WriteMid(t); //中序输出赋值后表达式
if(In(t->data,OP)) //根结点是否为运算符
{
V=Value(t,t->lchild->data,t->rchild->data);
cout<<"\n表达式的值是: "<<V;
}
else
cout<<"表达式的值是:"<<t->data-'0'<<endl;
CompoundExpr();//不会实现表达式组合
}

搜索更多相关主题的帖子: 运行 表达 
2007-01-11 15:23
sundan
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-1-17
收藏
得分:0 
你能帮忙告诉我关于树和森林与二叉树的相互转换的过程和原理吗?
谢谢!
2007-01-17 16:47
快速回复:[求助]我的表达式的程序不能完全运行啊!!
数据加载中...
 
   



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

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