101 lines
1.6 KiB
C
101 lines
1.6 KiB
C
|
#include <stdio.h>
|
||
|
#include <stdbool.h>
|
||
|
#include "stack.h"
|
||
|
|
||
|
bool isWhitespace(char c)
|
||
|
{
|
||
|
return(c == ' ' || c == '\t' || c == '\n' || c == '\r' );
|
||
|
}
|
||
|
|
||
|
char *eatAllWhitespaces(char *At)
|
||
|
{
|
||
|
while(*At && isWhitespace(*At))
|
||
|
At++;
|
||
|
return At;
|
||
|
}
|
||
|
|
||
|
bool isDigit(char Digit)
|
||
|
{
|
||
|
return (Digit >= '0' && Digit <= '9');
|
||
|
}
|
||
|
|
||
|
int isNumber(char *Number)
|
||
|
{
|
||
|
int Result = 0;
|
||
|
while(*Number && *Number != ' ')
|
||
|
{
|
||
|
if(!isDigit(*Number))
|
||
|
{
|
||
|
Result = -1;
|
||
|
return Result;
|
||
|
}
|
||
|
Number++;
|
||
|
Result++;
|
||
|
}
|
||
|
|
||
|
return Result;
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
stack Stack = {};
|
||
|
float Result = 0;
|
||
|
//
|
||
|
// Parsing
|
||
|
//
|
||
|
//char *Input = "6 3 + 4 - 20 *";
|
||
|
char *Input = argv[1];
|
||
|
char *At = Input;
|
||
|
while(*At)
|
||
|
{
|
||
|
At = eatAllWhitespaces(At);
|
||
|
switch(*At)
|
||
|
{
|
||
|
case '+':
|
||
|
{
|
||
|
float Addent1 = pop(&Stack);
|
||
|
float Addent2 = pop(&Stack);
|
||
|
push(&Stack, Addent1 + Addent2);
|
||
|
}break;
|
||
|
case '-':
|
||
|
{
|
||
|
float Subtrahend = pop(&Stack);
|
||
|
float Minuend = pop(&Stack);
|
||
|
|
||
|
push(&Stack, Minuend - Subtrahend);
|
||
|
}break;
|
||
|
case '*':
|
||
|
{
|
||
|
float Multiplicand = pop(&Stack);
|
||
|
float Multiplier = pop(&Stack);
|
||
|
push(&Stack, Multiplier * Multiplicand);
|
||
|
}break;
|
||
|
case '/':
|
||
|
{
|
||
|
float divisor = pop(&Stack);
|
||
|
float dividend = pop(&Stack);
|
||
|
push(&Stack, dividend / divisor);
|
||
|
}break;
|
||
|
default:
|
||
|
{
|
||
|
int Length = isNumber(At);
|
||
|
if(Length != -1)
|
||
|
{
|
||
|
push(&Stack, atof(At));
|
||
|
At += Length -1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("ERROR: Only Numbers and Operators + - * and / are allowed");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
At++;
|
||
|
}
|
||
|
while(peak(&Stack))
|
||
|
{
|
||
|
printf("%f ", pop(&Stack));
|
||
|
}
|
||
|
printf("\n");
|
||
|
}
|