后缀表达式计算

利用栈完成后缀表达式的计算(1043)

Time limit(ms): 1000
Memory limit(kb): 10000
Submission: 384
Accepted: 235
Accepted

后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将后缀表达式的结果计算出来。

Description

后缀表达式。以#号作为表达式结束标志。为了简单,处理的数据为0-9的整数。

Input

计算结果。

Output
1
3 6 6 2 / - 3 * +#
Sample Input
1
12
Sample Output

#include

#include
#include
int main()
{
void res();
res();
return 0;
}
void res()
{
void caculate(char str[]);
int i=0;
char ch;
char str[100];
while(1)
{
scanf("%c",&ch);
if(ch=='#')
break;
else
{
if(ch!=' ')
{
str[i]=ch;
i++;
}
}
}
str[i]='\0';
// printf("%s",str);
caculate(str);

}
void caculate(char str[])
{
double stack[100];
int len=strlen(str);
int i,j=0;
double a,b,c;
for(i=0;i{
if(str[i]>='0' && str[i]<='9')
{
stack[j]=str[i]-'0';
j++;
}
if(str[i]=='+')
{
j--;
a=stack[j];
j--;
b=stack[j];
c=a+b;
stack[j]=c;
j++;
}
else if(str[i]=='-')
{
j--;
a=stack[j];
j--;
b=stack[j];
c=b-a;
stack[j]=c;
j++;
}
else if(str[i]=='*')
{
j--;
a=stack[j];
j--;
b=stack[j];
c=a*b;
stack[j]=c;
j++;
}
else if(str[i]=='/')
{
j--;
a=stack[j];
j--;
b=stack[j];
c=b/a;
stack[j]=c;
j++;
}
}
printf("%g",stack[j-1]);

}

利用栈后进先出。。当遇到运算符的时候,栈顶开始退后两位计算结果再入栈

你可能感兴趣的:(算法)