一、题目
输入一行表示后缀表达式,数与数之间一定有空格隔开(可能不只一个空格),最后输入@表示输入结束
二、分析
后缀表达式,特点为运算符在两个操作数后,所可以用栈来实现。
用一个栈来存储数,遇到运算符则弹出两个数来进行计算,然后将结果入栈。
三、算法实现
(主要代码)
数据结构:栈。这里我用的是一个整型数组:a[1000].
char s[1000];
int i,x,f,e,d,tag,j=0,n;
int a[1000]={0,};
gets(s);
n=strlen(s);//读取时直接用字符串数组读取。
for(i=0; s[i];)
{
tag=0,x=0;//关键步骤:包含多位数的处理方式。
while(i<n&&'0'<=s[i]&&s[i]<='9')
{
x=x*10,x=x+s[i]-'0',i++,tag=1;
}
if(tag)//入栈
a[j++]=x;
else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')//运算
{
d=a[--j];
e=a[--j];
switch(s[i])
{
case '+':
f=e+d;
break;
case '-':
f=e-d;
break;
case '*':
f=e*d;
break;
case '/':
f=e/d;
break;
}
a[j++]=f;
i++;
}
else
i++;
}
printf("%d",a[0]);
四、算法分析
算法分析:其实就是遍历了字符串数组一趟,所以大致的时间复杂度为O(N)。
空间复杂度为O(N)。此题灵活运用了栈的“后进先出”的特点。很有代表意义。