#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//栈的操作
#define max 10
typedef struct zhan
{
double V[max];
int base;
int top;
}zhan;
//初始化
zhan* init()
{
zhan* p;
p = (zhan*)malloc(sizeof(zhan));
p->base = p->top = 0;
for (int i = 0; i < max; i++)
p->V[i] = 0;
return p;
}
//压栈
void push(zhan* L,double a)
{
if (is_full(L))
{
printf("full\n");
return;
}
L->V[L->top] = a;
L->top++;
}
//出栈
void pop(zhan* L)
{
if (is_empty(L))
{
printf("empty\n");
return;
}
L->top--;
L->V[L->top] = 0;
}
//查看栈顶元素
double serach(zhan* L)
{
if (is_empty(L))
{
printf("empty\n");
return 0;
}
double a = L->V[L->top - 1];
return a;
}
//判断是否为空
int is_empty(zhan* L)
{
if (L->top == L->base)
return 1;
return 0;
}
//判断是否满
int is_full(zhan* L)
{
if (L->top >= max)
return 1;
return 0;
}
//操作函数
void operate(zhan* open, zhan* fu)
{
char h =(char) serach(fu);
if (h == '*')
{
double m = serach(open);
pop(open);
double n = serach(open);
pop(open);
double k = n * m;
push(open, k);
}
if (h =='/')
{
double m = serach(open);
pop(open);
double n = serach(open);
pop(open);
double k = n / m;
push(open, k);
}
if (h == '+')
{
double m = serach(open);
pop(open);
double n = serach(open);
pop(open);
double k = n + m;
push(open, k);
}
if (h == '-')
{
double m = serach(open);
pop(open);
double n = serach(open);
pop(open);
double k = n - m;
push(open, k);
}
pop(fu);
}
//有字符串转数字及符号
void zhuan(char*k)
{
//初始化操作数栈
zhan* open = init();
//初始化操作符栈
zhan* fu = init();
while(*k!='=')
{
//如果是数字
if (*k <= '9' && *k >= '0')
//暂时存储一下
{
char h = *k;
double m = (double)h - (double)'0';
push(open, m);
k++;
while (1)
{
if (*k <= '9' && *k >= '0')
{
double n = serach(open);
pop(open);
h = *k;
m = n * 10 + (double)h - (double)'0';
push(open, m);
k++;
}
else
{
break;
}
}
if (*k == '.')
{
k++;
int i = 1;
while (1)
{
if (*k <= '9' && *k >= '0')
{
m = serach(open);
pop(open);
char h = *k;
m = m + ((double)h - (double)'0') / pow(10, i);
i++;
push(open, m);
k++;
}
else
{
break;
}
}
}
}
if (*k == '+')
{
while(1)
{
char h = (char)serach(fu);
if (h == '*'||h=='/')
{
operate(open, fu);
}
else
{
break;
}
}
char h = *k;
double l = (double)h;
push(fu, h);
k++;
}
if (*k == '-')
{
while (1)
{
char h = (char)serach(fu);
if (h == '*' || h == '/')
{
operate(open, fu);
}
else
{
break;
}
}
char h = *k;
double l = (double)h;
push(fu, h);
k++;
}
if (*k == '*')
{
char l = *k;
double m = (double)l;
push(fu, l);
k++;
}
if (*k == '/')
{
char l = *k;
double m = (double)l;
push(fu, l);
k++;
}
if (*k == '(')
{
char l = *k;
double m = (double)l;
push(fu, l);
k++;
}
if (*k == ')')
{
while (1)
{
char m = (char)serach(fu);
if (m == '(')
{
pop(fu);
break;
}
else
{
operate(open, fu);
}
}
k++;
}
}
while (!is_empty(fu))
{
operate(open, fu);
}
double m = serach(open);
printf("%lf", m);
}
//测试函数
void test01()
{
char shi[1024];
scanf("%s", shi);
zhuan(shi);
}
int main()
{
test01();
}