# 基于C语言实现的表达式求解
# 1 解题思路
构造包含顶指针,底指针和增量的结构体。然后分别构造一个只包含运算符的栈(OPTR)和只包含数字的栈(OPND)。之后依次读入所输入的表达式。判断是不是数字,如果是数字就将数字放入数字栈(OPND)。如果不是即运算符,让运算符栈栈顶元素和读入的运算符进行比较。如果优先级小于将读入的运算符入栈,优先级相等的就让栈顶元素出栈,优先级的大于的就让栈顶元素弹栈,并且连续两次让数字栈弹栈,得到一个运算符和两个数字,进行计算,得到的结果放入数字栈。循环以上过程直到读入的表达式字符为#为止。最后将数字栈出栈,即得到结果。
# 2 函数调用图
![](http://www.writebug.com/myres/static/uploads/2021/10/19/842c816b7a4bc47569bebd1c2cc28359.writebug)
# 3 各函数功能
```c++
// 构造空栈
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();
```
# 4 测试
![](http://www.writebug.com/myres/static/uploads/2021/10/19/a3c5e70aaccf154ab38bb0e5c9f365f9.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/63b0dd0f85f739666514aab0ad9265dd.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/09875005adb86d39a219a0eca12383f6.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/dbb46bf2ec0ddb6c3942db0cfa11de4c.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/74d43a43f6e0f681a670b3de37e00055.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/8697302c0d7119935b4751b9fcff0f6b.writebug)
# 5 编译与运行情况
编译正常通过。运行时如果计算中出现负数就无法运算,而且输入表达式的时候因为用的是getchar所以无法读出两位数以上的数字进行计算,这是该程序缺陷的地方。