1 解题思路
构造包含顶指针,底指针和增量的结构体。然后分别构造一个只包含运算符的栈(OPTR)和只包含数字的栈(OPND)。之后依次读入所输入的表达式。判断是不是数字,如果是数字就将数字放入数字栈(OPND)。如果不是即运算符,让运算符栈栈顶元素和读入的运算符进行比较。如果优先级小于将读入的运算符入栈,优先级相等的就让栈顶元素出栈,优先级的大于的就让栈顶元素弹栈,并且连续两次让数字栈弹栈,得到一个运算符和两个数字,进行计算,得到的结果放入数字栈。循环以上过程直到读入的表达式字符为#为止。最后将数字栈出栈,即得到结果。
2 函数调用图
![6607861-bf2b7b69654e6d7f.png](https://i-blog.csdnimg.cn/blog_migrate/4b5bdbd9c948dccb4ebba15762316561.png)
3 各函数功能
// 构造空栈
char InitStack (SqStack *S);
// 让e入栈
char Push(SqStack *S, char e);
// 让e出栈
char Pop(SqStack *S, char *e);
// 返回栈顶第一个元素
char getTop(SqStack S);
// 比较两个运算符的优先级,a,b中存放待比较的运算符,'>'表示a>b,'0'表示不可能出现的比较,这是通过二维数组建立比较表实现的
char Precede(char a, char b);
// 判断输入的某个字符是否是运算符
int in(char c, char OP[8]);
// 四则运算计算
char Operate(char a, char n, char b);
// 表达式计算,流程控制
char evaluateExpression(SqStack OPTR, SqStack OPND);
// 主函数,建立OPTR与OPND栈
int main();
参考文档和完整的文档和源码下载地址: