diff --git a/a1/program.c b/a1/program.c index 80dcafa..a8d341f 100644 --- a/a1/program.c +++ b/a1/program.c @@ -1 +1,162 @@ -//////// \ No newline at end of file +#include +#include +#include +#include +//// @ +#define STACK_SIZE 200 + +struct Stack +{ + char values[STACK_SIZE]; + int size; +}; + +void push_stack(struct Stack* stack, float value); +char pop_stack(struct Stack* stack); +int count_stack(struct Stack* stack); + + +void push_stack(struct Stack* stack, char value) +{ + assert(stack->size < STACK_SIZE); + stack->values[stack->size] = value; + stack->size += 1; +} +char pop_stack(struct Stack* stack) +{ + assert(stack->size > 0); + char value = stack->values[stack->size-1]; + stack->size -= 1; + return value; +} +int count_stack(struct Stack* stack) +{ + return stack->size; +} + +void print_stack(struct Stack* stack) +{ + for (int i=0; isize; i++) + { + printf("%.2f ", stack->values[i]); + } + printf("\n"); +} + +char para(char c) +{ + if(c=='(') return ')'; + if(c=='<') return '>'; + if(c=='{') return '}'; + if(c=='[') return ']'; + + if(c==')') return '('; + if(c=='>') return '<'; + if(c=='}') return '{'; + if(c==']') return '['; +} + +int main() +{ + struct Stack mystack; + mystack.size=0; + + char str[128]; + scanf("%s", str); + printf("Read: %s", str); + + int i=0; + char c, cs; + while(str[i]!='\0') + { + c=str[i]; + if(c=='<'||c=='('||c=='{'||c=='[') + { + push_stack(&mystack, c); + } + if(c=='>') + { + cs=pop_stack(&mystack); + if(cs!='<') + { + printf("Crossed bracket %c in %d, expected %c", c, i); + } + } + + } + + + + + + + + int err=0; + + char buf[505]; + + do + { + char* p=fgets(buf, 299, stdin); + if(p) + { + char c=buf[0]; + float op1, op2, rez; + if(c=='+'||c=='-'||c=='/'||c=='*') + { + if(count_stack(&mystack)<2) + { + printf("not enough operands\n"); + err=3; + break; + } + op2=pop_stack(&mystack); + op1=pop_stack(&mystack); + switch(c) + { + case '+': rez=op1+op2; break; + case '-': rez=op1-op2; break; + case '/': + if(c=='/' && op2==0) + { + err=1; + printf("division by zero\n"); + } + else + rez=op1/op2; + break; + case '*': rez=op1*op2; break; + } + } + else + { + if(isdigit(c)) + { + rez=atof(buf); + } + else + { + err=1; + printf("bad input\n"); + } + } + + if(!err) + { + if(count_stack(&mystack)==STACK_SIZE) + { + printf("full stack\n"); + err=4; + break; + } + push_stack(&mystack, rez); + print_stack(&mystack); + } + } + else break; + + }while(1); + if(!err) + printf("no input\n"); + return 0; +} \ No newline at end of file