学习笔记------数据结构(C语言版)栈应用 表达式求值

来源:互联网 发布:北京和隆优化科技 编辑:程序博客网 时间:2024/05/23 23:02

//main.cpp

#include "predefined.h"#include "SqStack.h"SElemType EvaluateExpression();SElemType GetTop_OPTR(SqStack S);Status In(SElemType c);SElemType Precede(SElemType c1,SElemType c2);SElemType Operate(SElemType a,SElemType c,SElemType b);int main(){SElemType result;printf("请输入表达式:");result=EvaluateExpression();printf("=%c",result);return 0;}SElemType EvaluateExpression()//算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈,//OP为运算符集合。{SqStack OPTR,OPND;InitStack(&OPTR);InitStack(&OPND);Push(&OPTR,'#');SElemType a,b,c,d;c=getchar();while(c!='#'||GetTop_OPTR(OPTR)!='#'){if(!In(c)){Push(&OPND,c);c=getchar();}else{switch(Precede(GetTop_OPTR(OPTR),c)){case '>':Pop(&OPTR,&d);Pop(&OPND,&b);Pop(&OPND,&a);Push(&OPND,Operate(a,d,b));break;case '<':Push(&OPTR,c);c=getchar();break;case '=':Pop(&OPTR,&c);c=getchar();break;}}}return GetTop_OPTR(OPND);}SElemType GetTop_OPTR(SqStack S){if(StackEmpty(S)) return ERROR;return *((S).top-1);}Status In(SElemType c){switch(c){case '+':case '-':case '*':case '/':case '(':case ')':case '#':return TRUE;default:return FALSE;}}SElemType Precede(SElemType c1,SElemType c2){SElemType f;switch(c1){case '+':case '-':if(c2=='*'||c2=='/'||c2=='(') f='<'; else f='>';break;case '*':case '/':if(c2=='(') f='<';     else f='>';break;case '(':if(c2==')') f='='; else if(c2=='#') { printf("输入错误!!!\n"); exit(ERROR); } else f='<';break;case ')':if(c2=='(') { printf("输入错误!!!\n"); exit(ERROR); } else f='>';case '#':if(c2==')') { printf("输入错误!!!\n"); exit(ERROR); } else if(c2=='#') f='='; else f='<'; break;}return f;}SElemType Operate(SElemType a,SElemType c,SElemType b){SElemType x=a-48;SElemType y=b-48;switch(c){case '+':return (x+y+48);case '-':return (x-y+48);case '*':return (x*y+48);case '/':return (x/y+48);}}


0 0