逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
/*注意编译时命令为 gcc stank.c -lm加上编译的时候链接数学库*/
typedef double ElemType ;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define MAXBUFFER 10
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
void initStack(sqStack *s);
void Push(sqStack *s,ElemType e);
void Pop(sqStack *s,ElemType *e);
void DestroyStack(sqStack *s);
int StackLen(sqStack *s);
int main()
{
sqStack stack,*S ;//注意要有实体不能用指针直接来
S = &stack;
initStack(S);
double d,e;
char c;
int i = 0;
char str[MAXBUFFER];
scanf("%c",&c);
while(c != '#')
{
while(isdigit(c)||c == '.')//判断是否时数字
{
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 '+':
// printf("1");
Pop(S,&e);
Pop(S,&d);
Push(S,e+d);
break;
case '-':
// printf("2");
Pop(S,&e);
Pop(S,&d);
Push(S,d-e);
break;
case '*':
// printf("3");
Pop(S,&e);
Pop(S,&d);
Push(S,d*e);
break;
case '/':
// printf("4");
Pop(S,&e);
Pop(S,&d);
if(e != 0)
{
Push(S,d/e);
}
else
{
printf("除数为0");
return -1;
}
break;
}
scanf("%c",&c);
}
Pop(S,&d);
printf("结果:%f",d);
return 0;
}
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)
{
s->base = (ElemType*)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->top = s->base + s->stackSize;
s->stackSize = s->stackSize + STACKINCREMENT;
}
(*s->top) = e;
s->top++;
}
void Pop(sqStack *s,ElemType *e)
{
if(s->top == s->base)
{
*e = '0';
return ;
}
*e = *(--(s->top));
// printf("%d",*(s->top-1));
// s->top--;
}
//有问题
void DestroyStack(sqStack *s)
{
int i,len;
len = s->stackSize;
// len = 2;
for(i=0;i < len;i++)
{
free(s->base);
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
}
int StackLen(sqStack *s)
{
return (s->top-s->base);
}