usaa25/du3/program.c
2025-10-16 03:07:07 +02:00

125 lines
2.4 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 -1;
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(" \n");
}
int main()
{
struct stack mystack;
memset(&mystack,0,sizeof(struct stack));
char input[1000];
while (fgets(input,sizeof(input),stdin)!=NULL)
{
if(input[0]==10 || input[0]==13)
{
printf("no input\n");
return 0;
}
if((input[0]>=0 && input[0]<=47) || (input[0]>=58 && input[0]<=127))
{
printf("bad input\n");
return 0;
}
int flag=switch_operators(input);
input[strcspn(input,"\n")]=0;
if (flag==0 || flag==-1)
{
if(flag==-1 && mystack.values[mystack.size-1]==0)
{
printf("division by zero\n");
return 0;
}
float op_num=pop_stack(&mystack,input);
push_stack(&mystack,op_num);
}
else
{
char* ptr;
float num=strtof(input,&ptr);
push_stack(&mystack,num);
}
print_stack(&mystack);
}
return 0;
}