摘要
上期的计算器只能实现整数的运算,还有不能判断括号匹配问题,所以这次我对于计算器进行了修改,可以实现小数的‘+’,‘-’,‘*’,‘/’计算,以及对于计算式的判断。
算法思想
要想实现计算器,我们可以首先把中缀表达式转化为后缀表达式,再计算中缀表达式的值。
先建立两个栈。分别存放数字和操作符,输入的如果是数字,直接入数字栈,如果是操作符,先与栈顶元素判断优先级关系,优先级较大的话直接入栈,优先级较小的话进行一次计算,优先级相等(即左右括号判断),销栈顶元素。
算法函数
函数主体算法思想
double computer()
{
char ch;
Stack num;//定义数字栈
Stack ope;//定义符号栈
InitStack(num);//初始化数字栈
InitStack(ope);//初始化符号栈
push(ope,'=');
int q=1;
double e,a,b,s;
char c;
cin>>ch;
while(ch!='='||GetTop(ope)!='=')//判断计算式是否结束,将输入“=”作为计算式的结束符号
{
if(ch=='(')
{
q=0;
}
if(ch==')')
{
q=1;
}
if(In(ch)==0)//判断是否为符号
{
switch(cmp(GetTop(ope),ch)) //于栈顶元素判断优先级
{
case '<': //优先级较大,直接入栈
push(ope,ch);
cin>>ch;
break;
case '>': //优先级较小,进行运算
c=GetTop(ope); //取符号栈栈顶元素
pop(ope); //销栈顶元素
a=GetTop(num); //取数字栈栈顶元素
pop(num); //销栈顶元素
b=GetTop(num); //取数字栈栈顶元素
pop(num); //销栈顶元素
push(num,count(a,c,b))