スタックの方法はポーランドのサフィックス式に逆です.


#define  _CRT_SECURE_NO_WARNINGS
#include
#include
#include

#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;
}

int Push(sqStack *s,ElemType e)
{
	if(s->top-s->base >= s->stackSize)
	{
		s->base=(ElemType*)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
		s->top=s->base+s->stackSize;
		s->stackSize=s->stackSize +STACKINCREMENT;
	}
	*(s->top)=e;
	s->top++;
	return 1;
}
int Pop(sqStack *s,ElemType *e)
{
	if(s->top==s->base)
		return 0;
	*e=*--(s->top);
	return 1;
}
int StackLen(sqStack s)
{
	return (s.top-s.base);
}


int main()
{
	sqStack s;
	char c;
	int i=0;;
	double d,e;
	char str[MAXBUFFER];
	InitStack(&s);
	printf("               ,             , #    
"); 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 '+': Pop(&s,&e); Pop(&s,&d); Push(&s,d+e); break; case '-': Pop(&s,&e); Pop(&s,&d); Push(&s,d-e); break; case '*': Pop(&s,&e); Pop(&s,&d); Push(&s,d*e); break; case '/': Pop(&s,&e); Pop(&s,&d); // Push(&s,d/e); if(e!=0) { Push(&s,d/e); } else { printf("
: 0!
"); } break; } scanf("%c",&c); } Pop(&s,&d); printf(" :%f
",d); system("pause"); return 0; }