逆波兰计算器1.0 (c语言 栈实现)支持小数计算
逆波兰计算器(C语言栈实现)
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为2 3 +。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为*2 3 + 4 *。其中运算符包括+ - * /四个。
并且由于栈具有后进先出的特性,所以用来实现逆波兰计算器就会十分方便.
话不多说,让我们上代码~:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
# define STACK_INIT_SIZE 20
# define STACKINCREMENT 10
# define MAXBUFFER 10
typedef double ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqstack;
void Initstack(sqstack *s)
{
s->base =(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->top=s->base;
s->stackSize=STACK_INIT_SIZE;
}
void push(sqstack *s,ElemType e)
{
if(s->top-s->base>=s->stackSize) //栈满,增加栈的size
{
s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
if(!s->base)
{
exit(0); //表示空间分配失败,用exit函数跳出。
}
}
*(s->top)=e;
s->top++;
}
void Pop(sqstack *s,ElemType *e)
{
if(s->top==s->base)
{
return;
}
*e=*--(s->top);
}
int StackLen(sqstack s)
{
return (s.top-s.base);
}
int main()
{
sqstack s;
char c;
double d, e;
char str[MAXBUFFER];
int i=0;
Initstack(&s);
printf("请按逆波兰表达式输入待计算数据,数据与运算符之间以空格隔开,以#符号作为结束标志:\n");
scanf("%c",&c);
while(c!='#')
{
while(isdigit(c)||c=='.') //isdigit判断‘c'的ASCLL码是不是在48-57之间,需要ctype.h头文件。
{
str[i++]=c; //用于过滤数字。
str[i]='\0';
if(i>=10)
{
printf("出错,输入的单个数据过大,超过我们设置的键盘缓冲区");
return -1;
}
scanf("%c",&c);
if(c==' ')
{
d=atof(str); //将字符型转化为浮点型
push(&s,d);
i=0;
break;
}
}
switch(c)
{
case '+':
Pop(&s,&e);
Pop(&s,&d);
push(&s,d+e);
break;
case '-':
Pop(&s,&e);
Pop(&s,&e);
push(&s,d-e);
break;
case '*':
Pop(&s,&e);
Pop(&s,&d);
push(&s,d*e);
case '/':
Pop(&s,&e);
if(e==0)
{
printf("\n除数等于0,输入错误。\n");
return -1;
}
else
{
Pop(&s,&d);
push(&s,d/e);
break;
}
}
scanf("%c",&c);
}
Pop(&s,&d);
printf("\n最终的计算结果为:%f\n",d);
return 0;
}