• 大小: 674KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-08
  • 语言: 其他
  • 标签: 计算器  语法树  

资源简介

实现了中缀式变后缀,语法树的生成,可以进行简单的计算

资源截图

代码片段和文件信息

#include“seqstack.h“
#include“Function.h“
# include
char string[30];  //从键盘接受的源字符串组
char postex[30];    //转化后的后缀式数组
char tree[10][3];   //存放语法树
Function f;
seqstack stack(30);
void print(char s[]int l)
{

for(int i=0;i {
if(s[i]==‘#‘) break;
else cout< }
cout<}

//把中缀式变为后缀式,形参是中缀表达式 
void postfix(char s[])  
{
int ij;
stack.push(‘#‘);
char x1=stack.gettop();
i=j=0;
char x2=s[i++];
while(!stack.empty())
{
//数字与字母直接输出
if(f.characterType(x2)==0)
{
postex[j++]=x2;
x2=s[i++];
}
else if(f.characterType(x2)==1)
{
postex[j++]=x2;
x2=s[i++];
}
//进行运算符(op1op2)优先级的比较
else if(f.priority_comp(x1x2)==‘<‘)
{
stack.push(x2);
x1=stack.gettop();
x2=s[i++];
}
else if(f.priority_comp(x1x2)==‘>‘)
{
x1=stack.pop();
postex[j++]=x1;
if(!stack.empty())
x1=stack.gettop();
}
else if(f.priority_comp(x1x2)==‘=‘)
{
if(x2==‘#‘||x2==‘=‘) break;
else {
stack.pop();
if(!stack.empty())
{
x1=stack.gettop();
x2=s[i++];
}
}
}
}
//增加一个结束标志
postex[j++]=‘#‘;
stack.clear();

}
//输出语法树
void printtree(char s[])
{
//本程序只实现了简单的四则运算
char oparray[4]={‘+‘‘-‘‘*‘‘/‘};
int l=(int)strlen(s);
int ij;
int m=0;
int t=-1;
int p=0;
char sa;
for(i=0;i {
sa=s[i];

if(sa==‘#‘) break;//如果为‘#’,结束
//找到后缀式中的第一个运算符
for(j=0;j<4;j++)
{
while(sa!=oparray[j]) j++; 
if(j<4) break;
}
if(j<4)
{
p=i-1;
tree[m][0]=sa;
s[i]=‘#‘;
if(s[p]!=‘#‘)
{
tree[m][2]=s[p];
s[p]=‘#‘;
if(s[p-1]!=‘#‘)
{
tree[m][1]=s[p-1];
s[p-1]=‘#‘;
if(m!=0) t=m-1;

}
else tree[m][1]=char(m-1);
}
else
{
p--;
while(p>=0&&s[p]==‘#‘) p--;
if(p>=0)
{
tree[m][1]=s[p]s[p]=‘#‘;
tree[m][2]=char(m-1);

}
else
{
tree[m][1]=char(t);
tree[m][2]=char(m-1);

}
}
m++;
}
}
m--;
int left=19center=20;
//可以输出  ‘/‘ 或者 ‘\‘作为指示!!
for( ;m>=0;m--)              
{
if(tree[m][0]!=‘L‘&&tree[m][0]!=‘R‘)
cout< else if(tree[m][0]==‘L‘) left=center-6center=left;
else left=center+3center=left;
if(f.characterType(tree[m][1])==0) 
left-=3cout< else
{
t=int(tree[m][1]);
left-=3;
cout< tree[t][0]=‘L‘;
}
if(f.characterType(tree[m][2])==0)
cout< else
{
t=int(tree[m][2]);
cout< tree[t][0]=‘R‘;
}
cout< }
stack.clear();
}




//计算表达式的结果,利用全局变量oparg等
double compute(char s[])
{

stack.push(‘#‘);
int l=(int)strlen(s);
int ij;
//先判断表达式是否能计算,是否存在异常!
for(i=0;i if(f.characterType(s[i])==0)
{
cout<<“ 表达式中有符号变量需要赋值,无法求出结果!!“<

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     379392  2008-05-19 11:10  编译实验\报告.doc

     文件       4899  2008-05-19 11:08  编译实验\代码\ff.cpp

     文件      50176  2002-07-02 15:24  编译实验\代码\ff.ncb

     文件        238  2002-07-02 15:24  编译实验\代码\ff.plg

     文件       1676  2008-05-18 22:11  编译实验\代码\Function.h

     文件       1186  2008-05-18 21:27  编译实验\代码\seqstack.h

    ..A.SH.     22016  2008-05-19 10:51  编译实验\代码\Thumbs.db

     文件       3693  2002-07-02 15:24  编译实验\代码\ff.dsp

     文件      48640  2002-07-02 15:24  编译实验\代码\ff.opt

     文件        529  2002-07-02 15:24  编译实验\代码\ff.dsw

     文件     241718  2008-05-19 11:08  编译实验\代码\Debug\ff.exe

     文件     488252  2008-05-19 11:08  编译实验\代码\Debug\ff.ilk

     文件      33168  2008-05-19 11:08  编译实验\代码\Debug\ff.obj

     文件     300044  2008-05-18 22:11  编译实验\代码\Debug\ff.pch

     文件     574464  2008-05-19 11:08  编译实验\代码\Debug\ff.pdb

     文件      58368  2002-07-02 15:24  编译实验\代码\Debug\vc60.idb

     文件      69632  2008-05-19 11:08  编译实验\代码\Debug\vc60.pdb

     目录          0  2002-07-02 15:25  编译实验\代码\Debug

     目录          0  2002-07-02 15:25  编译实验\代码

     目录          0  2002-07-02 15:24  编译实验

----------- ---------  ---------- -----  ----

              2278091                    20


评论

共有 条评论