#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
enum link { PUSH, PUSH_NO };
typedef struct
{
int num[MAX];
int top;
}OP_num;
typedef struct
{
char str[MAX];
int top;
}OP_ch;
void SETNULL_num(OP_num* s)
{
s->top = -1;
}
void SETNULL_ch(OP_ch* s)
{
s->top = -1;
}
int is_num(char ch)
{
if (ch >= '0' && ch <= '9')
{
return 1;
}
else
{
return 0;
}
}
int PUSH_num(OP_num* s, int data)
{
if ((MAX - 1) == s->top)
{
return 0;
}
else
{
s->num[++s->top] = data;
}
}
int PUSH_ch(OP_ch* s, char ch)
{
if ((MAX - 1) == s->top)
{
return 0;
}
else
{
s->str[++s->top] = ch;
}
}
int jud(OP_ch* s, char ch)
{
if (-1 == s->top)
{
return PUSH;
}
else
{
switch (s->str[s->top])
{
case '+':
case '-':
{
if (ch == '+' || ch == '-' )
{
return PUSH_NO;
}
else
{
return PUSH;
}
break;
}
}
}
}
int Pop_num(OP_num* s)
{
return (s->num[s->top--]);
}
void Pop_ch(OP_ch* s)
{
s->top--;
}
void operate(OP_ch* s_ch, OP_num* s_sum)
{
int a = Pop_num(s_sum);
int b = Pop_num(s_sum);
int result;
switch (s_ch->str[s_ch->top])
{
case '+':
result = a + b;
break;
case '-':
result = b - a;
break;
}
PUSH_num(s_sum, result);
}
int main()
{
OP_num sdata;
OP_ch soper;
SETNULL_num(&sdata);
SETNULL_ch(&soper);
int i = 0, len_str, t;
char str[MAX];
char str_num[MAX];
gets(str);
len_str = strlen(str);
while (str[i] != '\0')
{
if (is_num(str[i]))
{
t = 0;
while (is_num(str[i]))
{
str_num[t++] = str[i++];
}
str_num[t] = '\0';
PUSH_num(&sdata, atoi(str_num));
}
else
{
PUSH_ch(&soper, str[i]);
i++;
}
}
while (soper.top != -1)
{
operate(&soper, &sdata);
Pop_ch(&soper);
}
printf("%d\n", sdata.num[sdata.top]);
return 0;
}
