116 lines
2.2 KiB
C
116 lines
2.2 KiB
C
#include<stdio.h>
|
|
#include<assert.h>
|
|
#include<string.h>
|
|
#include<stdlib.h>
|
|
|
|
#define STACK_SIZE 10
|
|
|
|
struct stack
|
|
{
|
|
float values[STACK_SIZE];
|
|
int size;
|
|
};
|
|
|
|
void push_stack(struct stack* mystack, float value)
|
|
{
|
|
assert(mystack->size<STACK_SIZE);
|
|
mystack->values[mystack->size]=value;
|
|
mystack->size+=1;
|
|
}
|
|
|
|
int switch_operators(const char input[])
|
|
{
|
|
switch (input[0])
|
|
{
|
|
case '+':
|
|
return 0;
|
|
break;
|
|
case '-':
|
|
return 0;
|
|
break;
|
|
case '*':
|
|
return 0;
|
|
break;
|
|
case '/':
|
|
return 0;
|
|
break;
|
|
default:
|
|
return 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
float pop_stack(struct stack* mystack,const char input[])
|
|
{
|
|
assert(mystack->size>1);
|
|
float val1=mystack->values[mystack->size-2];
|
|
float val2=mystack->values[mystack->size-1];
|
|
switch (input[0])
|
|
{
|
|
case '+':
|
|
mystack->size-=2;
|
|
return val1+val2;
|
|
break;
|
|
case '-':
|
|
mystack->size-=2;
|
|
return val1-val2;
|
|
break;
|
|
case '*':
|
|
mystack->size-=2;
|
|
return val1*val2;
|
|
break;
|
|
case '/':
|
|
mystack->size-=2;
|
|
return val1/val2;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void print_stack(struct stack* mystack)
|
|
{
|
|
for(int i=0;i<mystack->size;i++)
|
|
{
|
|
printf("%.2f",mystack->values[i]);
|
|
if (i<mystack->size-1)
|
|
{
|
|
printf(" ");
|
|
}
|
|
}
|
|
printf(" ");
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
struct stack mystack;
|
|
memset(&mystack,0,sizeof(struct stack));
|
|
char input[1000];
|
|
while (fgets(input,sizeof(input),stdin)!=NULL)
|
|
{
|
|
int flag=switch_operators(input);
|
|
input[strcspn(input,"\n")]=0;
|
|
if (strlen(input)==0)
|
|
{
|
|
printf("no input\n");
|
|
continue;
|
|
}
|
|
if (flag==0)
|
|
{
|
|
float op_num=pop_stack(&mystack,input);
|
|
push_stack(&mystack,op_num);
|
|
}
|
|
else
|
|
{
|
|
printf("\n");
|
|
char* ptr;
|
|
float num=strtof(input,&ptr);
|
|
push_stack(&mystack,num);
|
|
}
|
|
print_stack(&mystack);
|
|
}
|
|
return 0;
|
|
}
|
|
|