if( s.top != s.base )
return ( *(s.top-1) )-'0'; return 0; }
//运算符入栈
void OPTR_Push(Sqstack_OPTR&s,SElemType_OPTR e) {
if(s.top-s.base == s.stacksize) printf(\满栈!\\n\
*s.top++=e; //先赋值后自加 }
//操作数入栈
void OPND_Push(Sqstack_OPND&s,SElemType_OPND e) {
if(s.top-s.base == s.stacksize) printf(\满栈!\\n\
*s.top++=e+'0'; //先赋值后自加 }
//运算符出栈
void OPTR_Pop(Sqstack_OPTR&s,SElemType_OPTR&e) {
if(s.top == s.base)
printf(\空栈!\\n\ e=*--s.top; }
//操作数出栈
void OPND_Pop(Sqstack_OPND&s,SElemType_OPND&e) {
if(s.top == s.base)
printf(\空栈!\\n\ e=(*--s.top)-'0'; }
/*其他函数的实现*/ #include \#include \#include \
//算数表达式求值的算法优先算法 double EvaluateExpression( )
{
Sqstack_OPTR OPTR; Sqstack_OPND OPND; char ch;
char x; //弹出的'('
char dimo='0'; //记录小数点分前后计算
double p=0; //将输入的操作数处理后得double p;然后p入栈 double q=0.1; //小数点后运算
int low=1; //判断负数
int flag=1; //用来判定 double p 是否入栈
SElemType_OPTR theta; //运算符栈顶元素
SElemType_OPNDa,b; //弹出的两个要运算的操作数
//初始化
OPTR_InitStack(OPTR); //OPTR运算符 OPND_InitStack(OPND); //OPND操作数
OPTR_Push(OPTR,'#'); //将表达式起始符压入运算符栈
scanf(\
if( ch == '-') {
low=-1;
scanf(\ }
//保证接下来的实现从数字开始
while(ch != '#' || OPTR_GetTop(OPTR) != '#' ) {
if( isdigit(ch) || ch == '.') {
flag=1;
if(ch != '.' ) {
if ( dimo != '.' ) {
p = p*10 ; p += (ch-'0'); scanf(\
}
}
}
else if ( dimo == '.') {
p = p+(ch-'0')*q; q=q*q;;
scanf(\}
else if( ch == '.' ) {
dimo = '.';
scanf(\}
else {
if( flag == 1 ) {
OPND_Push(OPND,p*low); //操作数进栈OPND dimo='0'; p=0; q=0.1; }
switch( Precede( OPTR_GetTop(OPTR), ch ) ) {
case '<':
OPTR_Push(OPTR,ch); //运算符入栈 low = 1;
scanf(\ if( ch == '-' ) {
scanf(\ low = -1; }
break;
case '>':
OPTR_Pop(OPTR,theta); //运算符存到theta出栈 OPND_Pop(OPND,b); //操作数出栈
OPND_Pop(OPND,a); //操作数出栈
OPND_Push( OPND,Operate(a,theta,b) ); flag =0 ;
break; //注意此处没有输入!!!!!!!!!
case '=':
OPTR_Pop(OPTR,x); //相等的情况: 栈顶元素是'(',且ch是')' 即消除一对括号
scanf(\ //low=1; break; } } }
return OPND_GetTop( OPND ); }
//比较OPTR的栈顶元素和ch的优先级
char Precede (SElemType_OPTR top, char ch) {
switch (top) {
case '+':
if(ch=='+'||ch=='-'||ch==')'||ch=='#') return '>';
if(ch=='*'||ch=='/'||ch=='('||ch=='^') return '<'; break;
case '-':
if(ch=='+'||ch=='-'||ch==')'||ch=='#') return '>';
if(ch=='*'||ch=='/'||ch=='('||ch=='^') return '<'; break;
case '*':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'||ch=='#') return '>';
if(ch=='('||ch=='^') return '<'; break;
case '/':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'||ch=='#') return '>';
if(ch=='('||ch=='^') return '<'; break;
case '(':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(') return '<'; if(ch==')') return '='; if(ch=='^') return '<'; break;
case ')':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'||ch=='#'||ch=='^') return '>'; break;
case '#':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch=='^') return '<'; if(ch=='#') return '='; break;
case '^':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'||ch=='#') return '>'; if(ch=='(') return '='; break; }
return 0; }
//运算
double Operate (SElemType_OPND a, SElemType_OPTR theta, SElemType_OPND b)
{
switch(theta) {
case '+':
return a+b;break; case '-':
return a-b;break; case '*':
return a*b;break; case '/':
return a/b;break; case '^':
return pow(a,b);break; }
return 0; }
/* 测试程序*/
/* ctype.h是否为数字 intisdigit(intch); */
#include \#include \#include \
intmain() {
while (1) {
printf (\请输入算式表达式(以'#'结尾):\\n\ fflush(stdin);
printf ( \结果:\\n%.3lf \\n\ }
return 0; }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数据结构表达式求值完整篇(含实验报告)(2)在线全文阅读。
相关推荐: