题目
解题思路
后缀表达式,就是没有括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。例如3+4的后缀表达式是34+。这里很适合用栈来做。
以示例来说明:
3.5.2.-*7.+@
首先将数字入栈,当遇到‘-’时,将5和2出栈,计算5-2=3;遇到‘*’时,计算3*3-9;再将7入栈,遇到‘+’时,计算9+7=16.
要注意,直到遇到'.'数字才可以入栈,我好几次就因为这个
//错误的代码
if(a>='0'&&a<='9')
{
b[++top]=a-'0';
}
else if(a=='.')
{
continue;
}
//正确的代码
if(a>='0'&&a<='9')
{
c=a-'0';
i=i*10+c;
}
else if(a=='.')
{
b[++top]=i;
i=0;
}
废话不多说了。上AC代码
代码展示
#include<stdio.h>
#include<string.h>
char a;
long long b[10000];
long long top,len,c,i;
int main()
{
while(~scanf("%c",&a))
{
if(a=='@')//结束循环
break;
if(a>='0'&&a<='9')//计算数字
{
c=a-'0';
i=i*10+c;
}
else if(a=='.')//数字入栈
{
b[++top]=i;
i=0;
}
//计算
else if(a=='-')
{
b[top-1]=b[top-1]-b[top];
b[top]=0;
--top;
}
else if(a=='+')
{
b[top-1]=b[top-1]+b[top];
b[top]=0;
--top;
}
else if(a=='*')
{
b[top-1]=b[top-1]*b[top];
b[top]=0;
--top;
}
else if(a=='/')
{
b[top-1]=b[top-1]/b[top];
b[top]=0;
--top;
}
}
//for(int i=1; i<=top; i++)
printf("%lld\n",b[top]);
return 0;
}