#include<stdio.h>
#include<string.h>
#define MAXSIZE 100

struct seqstack1//数据栈 
{
	float data[MAXSIZE];//数组 
	int top;//栈顶 
};
int init_seqstack1(seqstack1 * s1)//初始化栈 
{
	s1->top=0;
}
int empty_seqstack1(seqstack1 * s1)//判空栈 
{
	if(s1->top==0)
		return 1;
	else
		return 0;
}
int push_seqstack1(seqstack1 * s1,float x)//入栈 
{
	if(s1->top==MAXSIZE)//判断是否超出栈的最大存储 
	{
		return 0;
	}
	else
	{
		s1->data[s1->top]=x;//元素入栈 
		s1->top++;//栈顶向上移 
		return 1;
	}
}
int pop_seqstack1(seqstack1 * s1,float *x)//出栈 
{
	if(s1->top==0)//判断是否为空栈 
	{
		return 0;
	}
	else//出栈顶元素 
	{
		s1->top--;
		*x=s1->data[s1->top];
		return 1;
	}
}

int print1(seqstack1 * s1)//遍历栈 
{
	int i;
	for(i=s1->top-1;i>=0;i--)
	{
		printf("%.2f ",s1->data[i]);
	}
	printf("\n");
}


struct seqstack2//操作栈 
{
	char data[MAXSIZE];//数组 
	int top;//栈顶 
};
int init_seqstack2(seqstack2 * s2)//初始化栈 
{
	s2->top=0;
}
int empty_seqstack2(seqstack2 * s2)//判空栈 
{
	if(s2->top==0)
		return 1;
	else
		return 0;
}
int push_seqstack2(seqstack2 * s2,char x)//入栈 
{
	if(s2->top==MAXSIZE)//判断是否超出栈的最大存储 
	{
		return 0;
	}
	else
	{
		s2->data[s2->top]=x;//元素入栈
		s2->top++;//栈顶向上移 
		return 1;
	}
}
int pop_seqstack2(seqstack2 * s2,char *x)//出栈 
{
	if(s2->top==0)//判断是否为空栈
	{
		return 0;
	}
	else//出栈顶元素 
	{
		s2->top--;//栈顶向下移 
		*x=s2->data[s2->top];
		return 1;
	}
}

int priority(char m,char n)//判断优先级 
{
	if(m=='*'&&(n=='-'||n=='+'||n=='/'||n=='*'))//比较 
	{
		return 1;
	}
	else if(m=='/'&&(n=='-'||n=='+'||n=='*'||n=='/'))//比较 
	{
		return 1;
	}
	else if(m=='+'&&(n=='-'||n=='+'))//比较 
	{
		return 1;
	}
	else if(m=='-'&&(n=='-'||n=='+'))//比较 
	{
		return 1;
	}
	else
	{
		return 0;
    }
}

float result(float m,float n,char s)//计算结果 
{
	if(s=='+')//判断运算方式 
	{
		return m+n;//返回值 
	}
	if(s=='-')//判断运算方式 
	{
		return m-n;//返回值 
	}
	if(s=='*')//判断运算方式 
	{
		return m*n;//返回值 
	}
    if(s=='/')//判断运算方式 
	{
		return m/n;//返回值 
	}
}

int main()//主函数 
{
	seqstack1 s1;//定义数据栈 
    seqstack2 s2;//定义操作栈 
	char str[100],s;
	float m,n,y,x;
	int i,j;
	while(1)
	{
		init_seqstack1(&s1);//初始化 
	    init_seqstack2(&s2);//初始化 
		gets(str);//输入数据 
		j=strlen(str);//计算数组长度 
		for(i=0;i<j;)
		{
			if(str[i]==' ')//跳过输入空格数据 
			{
           		i++;
				continue;
			}
			else if(str[i]>='0'&&str[i]<='9')//判断数字就入数据栈 
			{
            	y=str[i]-'0';//字符转换为数字 
            	i++;
            	while(str[i]>='0'&&str[i]<='9')//判断接下来的字符是不是数字 
            	{
                  	y=y*10+(str[i]-'0');
                  	i++;
            	}
				push_seqstack1(&s1,y);//转化的数字入数据栈 
			}
			else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')//判断运算符就入操作栈 
			{ 
				if(!empty_seqstack2(&s2))//判断操作栈是否为空 
				{
			    	while(!empty_seqstack2(&s2)&&priority(s2.data[s2.top-1],str[i]))//判断操作栈是否为空和运算符优先级 
			    	{
				    	pop_seqstack1(&s1,&n);//取数据栈顶元素 
				   		pop_seqstack1(&s1,&m);//取数据栈顶元素 
				    	pop_seqstack2(&s2,&s);//取操作栈顶元素 
				    	push_seqstack1(&s1,result(m,n,s));//计算值并入数据栈 
               		}
		    	}
            	push_seqstack2(&s2,str[i]);//操作符入栈 
            	i++;
			}
		
		}
		while(!empty_seqstack2(&s2))//判断操作栈是否为空
		{
        	pop_seqstack1(&s1,&n);//取数据栈顶元素
         	pop_seqstack1(&s1,&m);//取数据栈顶元素
         	pop_seqstack2(&s2,&s);//取操作栈顶元素
         	push_seqstack1(&s1,result(m,n,s)); //计算值并入数据栈
    	}
    	print1(&s1);//输出数据栈里结果 
	}
}