1.实验需求
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。要求:
- 从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
- 输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取整。
例如,输入:4+2*5= 输出:14
输入:(4+2)*(2-10)= 输出:-48
2.概要设计
(1)抽象数据类型的定义:
采用两种栈(符号栈和数字栈)分别存储运算符和数字
两种栈都有各自的初始化、push、pop等函数
typedef struct{//符号栈
char *base;
char *top;
int stacksize;
}Opstack;
typedef struct{//数字栈
int *base;
int *top;
int stacksize;
}Numstack;
(2)主程序流程
主函数main
先定义栈符号栈和数字栈,定义一个数组ch临时存储输入的计算式初始化符号栈schar,调用PushOp函数在栈底放一个’=’,初始化数字栈snum,调用gets函数,将表达式临时存储在数组ch里,求数组长度。
在while循环(ch数组不到最后一个=或者schar不到栈底=)中,先判断现在所指数组元素是数字还是符号,如果是数字,调用Num函数将char型数字转换成int型,并将数字存储进数字栈,数组指针移动。如果是符号,调用Precede函数比较它和符号栈栈顶元素的优先级,如果栈顶元素优先级小于现在数组里的运算符,将该运算符进栈,移动数组指针;如果等于,栈顶元素出栈;如果大于,取数字栈栈顶两个元素,和符号栈栈顶元素,进行计算,再将结果压入数字栈。
循环结束,输出数字栈栈顶元素,即为结果。
(3)各模块介绍
由主程序main依次调用:
- int InitOpStack(Opstack &s)符号栈初始化函数
- int PushOp(Opstack &s, char e)符号栈进栈函数
- int InitNumStack(Numstack &s)数字栈初始化函数
- char GetTopOp(Opstack &s)符号栈取栈顶函数
- int In(char c)判断是运算符还是数字函数