您的位置:首页 > 编程语言 > C语言/C++

逆波兰计算器

2016-07-22 21:37 459 查看
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
#define Stack_size 20
#define Stack_increasesize 20
#define MAX 50
typedef double Element;
typedef struct node{
Element *base;
Element *top;
int size;
}Stack;
void InitialStack(Stack *s)
{
s->base=(Element *)malloc(sizeof(Element)*Stack_size);
if(!s->base)
exit(0);
s->top=s->base;
s->size=Stack_size;
}
void Push(Stack *s,Element e)
{
if((s->top-s->base)==s->size)
{
s->base=(Element *)realloc(s->base,(Stack_size+Stack_increasesize)*sizeof(Element));
if(!s->base)
exit(0);
s->size=Stack_size+Stack_increasesize;
}
*(++s->top)=e;
}
void Pop(Stack *s,Element *e)
{
if(s->base==s->top)
return;
else
*e=*(s->top--);
}
int Length(Stack s)
{
return (s.top-s.base);
}
int main()
{
Stack S;
char c,s[MAX];
double a,b;
int i=0;
InitialStack(&S);
printf("输入后缀表达式,字符与字符之间用空格分开:\n");
scanf("%c",&c);
while(c!='\n')
{
while(isdigit(c)||c=='.')
{
s[i++]=c;
scanf("%c",&c);
if(c==' ')
{
s[i]='\0';
a=atof(s);
Push(&S,a);
i=0;
break;
}
}
switch(c)
{
case'-':
Pop(&S,&a);
Pop(&S,&b);
Push(&S,b-a);
break;
case'+':
Pop(&S,&a);
Pop(&S,&b);
Push(&S,b+a);
break;
case'*':
Pop(&S,&a);
Pop(&S,&b);
Push(&S,b*a);
break;
case'/':
Pop(&S,&a);
Pop(&S,&b);
if(a)
Push(&S,b/a);
else
{
printf("除数不能为0\n");
return -1;
}
break;
}
scanf("%c",&c);
}
Pop(&S,&a);
printf("结果是:%f\n",a);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 堆栈