Skip to content

Commit

Permalink
Evaluate reverse polish notation
Browse files Browse the repository at this point in the history
Signed-off-by: Leo Ma <[email protected]>
  • Loading branch information
begeekmyfriend committed Nov 10, 2017
1 parent bfc015f commit 06db8d3
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 0 deletions.
2 changes: 2 additions & 0 deletions 150_evaluate_reverse_polish_notation/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
all:
gcc -O2 -o test eval_rpn.c
87 changes: 87 additions & 0 deletions 150_evaluate_reverse_polish_notation/eval_rpn.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#include <stdio.h>
#include <stdlib.h>

static int a2i(char *s)
{
int n = 0;
int sign = 0;
while (*s != '\0') {
switch (s[0]) {
case '+':
break;
case '-':
sign = 1;
break;
case '*':
break;
case '/':
break;
default:
n = n * 10 + (s[0] - '0');
break;
}
s++;
}
return sign ? -n : n;
}

static int evalRPN(char **tokens, int tokensSize)
{
int i, res, a, b;
int stack[500], len = 0;

for (i = 0; i < tokensSize; i++) {
switch (tokens[i][0]) {
case '\0':
break;
case '+':
if (len > 0) {
b = stack[--len];
}
if (len > 0) {
a = stack[--len];
stack[len++] = a + b;
}
break;
case '*':
if (len > 0) {
b = stack[--len];
}
if (len > 0) {
a = stack[--len];
stack[len++] = a * b;
}
break;
case '/':
if (len > 0) {
b = stack[--len];
}
if (len > 0) {
a = stack[--len];
stack[len++] = a / b;
}
break;
case '-':
if (tokens[i][1] == '\0') {
if (len > 0) {
b = stack[--len];
}
if (len > 0) {
a = stack[--len];
stack[len++] = a - b;
}
break;
}
default:
stack[len++] = a2i(tokens[i]);
}
}

return len > 0 ? stack[len - 1] : 0;
}

int main(int argc, char **argv)
{
printf("%d\n", evalRPN(argv + 1, argc - 1));
return 0;
}

0 comments on commit 06db8d3

Please sign in to comment.