河北联合大学表达式遍历Word文档格式.docx
- 文档编号:19403196
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:26
- 大小:220.43KB
河北联合大学表达式遍历Word文档格式.docx
《河北联合大学表达式遍历Word文档格式.docx》由会员分享,可在线阅读,更多相关《河北联合大学表达式遍历Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
第一个算法的流程图:
用户输入的中缀表达式
主函数的流程图:
存在错误并结束程序
判断表达式中是否含有除数字、+、—、*、/、%、(、)以外的字符
返回计算结果
调用函数将中缀表达式转换成后缀表达式
调用函数通过后缀表达式计算出结果
图1主函数流程图
中缀转化为后缀的流程图:
如果是除括号以外的操作符
如果是数字或小数点
读取用户输入的字符并判断
优先级高于栈顶
如果是括号
入栈
与栈顶元素比较
判断括号类型
优先级低于栈顶
将其放入字符数组中,并在后面加上分隔符
如果是右括号
如果是左括号
栈顶元素出栈存入数组中
直接入栈
从栈中取出操作符
放入数组中
取出的不是左括号
图2中缀转化为后缀流程图
后缀表达式计算的流程图
后缀表达式
如果是操作符
如果是数字
判断符号类型
从数值栈中取出两个数计算并将结果放入栈中
转化为浮点数入栈
图3后缀表达式计算流程图
第二种算法的流程图
调用直接计算的函数
图4主函数流程图
直接计算函数的流程图:
转化为浮点数入数值栈
图4直接计算流程图
三、源代码
下面给出的是用中缀转后缀计算算法实现的程序的源代码:
#include<
stdio.h>
/*导入需要用到的各种包*/
stdlib.h>
string.h>
ctype.h>
typedefstruct/*定义结构体用来存储操作符*/
{
charop;
/*存储字符*/
intlevel;
/*存储优先级*/
}OpNode;
typedefstruct
OpNodeop[100];
inttop;
intsize;
/*表示栈内元素的个数*/
}stack;
/*定义符号栈*/
voidinit(stack*st)/*初始化栈*/
st->
size=0;
top=0;
}
OpNodepop(stack*a)/*出栈*/
if(a->
size==0)/*如果栈为空结束操作*/
{
exit(-1);
}
a->
size--;
returna->
op[--(a->
top)];
/*取出栈顶元素*/
voidpush(stack*a,OpNodeop)/*入栈函数*/
size++;
op[(a->
top)++]=op;
OpNodetop(stack*a)/*观察栈顶函数*/
printf("
stackisempty\n"
);
}
top)-1];
/*只得到栈顶的值而不出栈*/
typedefstruct/*定义数值栈*/
doublenum[100];
/*栈顶指针*/
}numstack;
voidinit2(numstack*st)/*初始化数值栈*/
doublepop2(numstack*a)/*数值栈出栈*/
size==0)/*出栈前的判空*/
num[--(a->
/*得到栈顶的值*/
voidpush2(numstack*a,doublenum)/*入栈*/
num[(a->
top)++]=num;
voidmain()/*主函数*/
voidchange(charstr[],charexp[]);
/*声明要用到的各个函数*/
doubleCalResult(charexp[]);
/*声明后缀表达式的计算函数*/
charstr[100],exp[100];
/*str存储原算术表达式,exp存储对应的printf("
算术表达式为:
\n"
后缀表达式,chestr存储容错字符'
^'
*/
gets(str);
change(str,exp);
/*调用函数将中缀转化为后缀*/
后缀表达式为:
%s\n"
exp);
运算结果为:
%f\n"
CalResult(exp));
/*调用函数计算后缀表达式*/
inta;
scanf(&
a);
voidchange(charstr[],charch[])/*将前缀表达式转化为后缀表达式*/
inti=0;
/*str的索引*/
intk=0;
charc;
/*字符串中取出的放在C中*/
stackst;
OpNodeop;
OpNodeops;
init(&
st);
/*初始化符号栈*/
c=str[i++];
while(c!
='
\0'
)/*对字符串进行扫描*/
if((!
isdigit(c))&
&
(c!
-'
)&
+'
(c!
%'
/'
*'
('
)'
)){
printf("
输入字符的格式错误\n"
break;
if(isdigit(c)||c=='
.'
)/*如果字符为数字或小数点*/
{
while(isdigit(c)||c=='
)
{
ch[k++]=c;
/*将字符直接放入数组中*/
c=str[i++];
}
ch[k++]='
|'
;
/*在其后面放入一个分隔符*/
}
if(c=='
)/*如果字符是左括号*/
{
op.op='
op.level=-1;
/*定义其优先级为-1*/
push(&
st,op);
/*将左括号直接入栈*/
if(c=='
)/*如果字符为右括号*/
op=top(&
/*首先观察栈顶*/
while(st.size!
=0&
op.op!
)/*如果不是左括号并且栈不为空*/
op=pop(&
/*出栈并存入数组中*/
ch[k++]=op.op;
if(st.size>
0)/*再次检查栈是否为空,*/
op=top(&
else
break;
/*为空就结束*/
}
pop(&
/*去掉左括号*/
||c=='
)/*如果是+-号*/
op.op=c;
op.level=1;
/*优先级为1*/
if(st.size==0)
push(&
/*如果此时栈为空直接入栈*/
else
ops=top(&
/*观察栈顶*/
while(ops.level>
=op.level)/*如果栈顶优先级高*/
{
ops=pop(&
ch[k++]=ops.op;
/*将栈顶元素取出存入数组中*/
if(st.size>
0)
ops=top(&
/*进行判空操作,栈为空结束*/
else
break;
}
/*此时栈顶优先级低,入栈*/
)/*如果是*/%号*/
op.op=c;
op.level=2;
if(st.size==0)
if(st.size>
ops=top(&
else
break;
}
/*索引自加检索下一个字符*/
while(st.size!
=0)/*最后判断栈如果不为空*/
ops=pop(&
/*取出栈内元素存入数组中*/
ch[k++]=ops.op;
ch[k]='
/*将\0作为结尾存入数组*/
doubleCalResult(charexp[])/*后缀表达式的计算*/
numstacknumst;
/*建立数值栈*/
doubled1,d2,dr;
/*后缀表达式的索引*/
/*将字符转化为浮点数的索引*/
char*s;
chartrans[100];
/*存字符表示的一段数字*/
init2(&
numst);
/*实现数值栈*/
c=exp[k++];
)/*开始扫描后缀表达式*/
)/*如果是操作符*/
switch(c)
case'
:
/*如果是加法操作*/
d2=pop2(&
d1=pop2(&
dr=d1+d2;
/*相加后入栈*/
push2(&
numst,dr);
break;
/*如果是减法操作*/
dr=d1-d2;
/*相减后入栈*/
/*如果是乘法操作*/
dr=d1*d2;
/*相乘后入栈*/
/*如果是除法操作*/
dr=d1/d2;
/*相除后入栈*/
/*如果是取余操作*/
dr=(double)((int)d1%(int)d2);
/*类型转化并取余后入栈*/
}
if(c>
0'
c<
9'
)/*如果是字符表示的数字*/
while(c>
)
trans[i++]=c;
/*将字符存入数组进行下一个的扫描*/
c=exp[k++];
trans[i++]='
i=0;
s=trans;
/*将指针指向该数组*/
d1=atof(s);
/*利用函数将字符串转化为浮点数*/
push2(&
numst,d1);
c=exp[k++];
returnpop2(&
/*最后结果将在数值栈中,取出作为返回值*/
下面给出的是用中缀直接计算算法实现的程序的源代码:
OpNodepop(stack*a)/*出栈*/
doubleDirectcalresult(charstr[]);
charstr[100];
/*str存储原算术表达式*/
直接运算的结果为:
Directcalresult(str));
/*调用直接计算函数*/
doubleDirectcalresult(charstr[])/*表达式的直接计算出结果*/
stackms;
/*建立符号栈*/
numstackmns;
doublecalculate(doubleod1,doubleod2,OpNodeop);
intindex=0;
intlen=strlen(str);
/*存放数值的一段字符*/
/*trans的索引*/
char*s;
doubled;
OpNodetempn;
/*存放当前扫描的操作符*/
OpNodetempln;
doubleoda,odb,odr;
doubleresult;
/*作为返回值返回结果*/
init(&
ms);
/*实现两个栈*/
init2(&
mns);
while(index<
len)/*开始对用户输入的表达式进行扫描*/
c=str[index++];
if((!
if(isdigit(c)||c=='
)/*如果是数字字符或小数点*/
while(isdigit(c)||c=='
trans[i]=c;
trans[i+1]='
i++;
/*将其存入数组扫描下一个*/
c=str[index++];
//trans[i++]='
/*扫描完一个数结束数组*/
i=0;
/*索引归0*/
s=trans;
d=atof(s);
push2(&
mns,d);
/*转化为浮点数入栈*/
if(c=='
)/*如果是+-*/
tempn.level=1;
/*优先级设为1*/
tempn.op=c;
if(ms.size==0)
ms,tempn);
/*栈为空直接入栈*/
templn=top(&
while(templn.level>
=tempn.level)/*栈顶优先级高*/
templn=pop(&
/*取出操作数和操作符计算*/
odb=pop2(&
oda=pop2(&
odr=calculate(oda,odb,templn);
push2(&
mns,odr);
/*结算结果入栈*/
if(ms.size>
{
templn=top(&
/*如果栈空结束*/
}
else
break;
/*操作符入栈*/
)/*如果是+/%操作*/
tempn.level=2;
/*定义优先级为2*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 联合 大学 表达式 遍历