#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);//输出数据栈里结果
}
}