Update a1/program.c
This commit is contained in:
parent
69490055a0
commit
a06a9d5f09
163
a1/program.c
163
a1/program.c
@ -1 +1,162 @@
|
||||
////////
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
//// @
|
||||
#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; i<stack->size; 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user