字尾表示式求值
阿新 • • 發佈:2020-12-15
一、題目
輸入一行表示字尾表示式,數與數之間一定有空格隔開(可能不只一個空格),最後輸入@表示輸入結束
二、分析
字尾表示式,特點為運算子在兩個運算元後,所可以用棧來實現。
用一個棧來儲存數,遇到運算子則彈出兩個數來進行計算,然後將結果入棧。
三、演算法實現
(主要程式碼)
資料結構:棧。這裡我用的是一個整型陣列: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)。此題靈活運用了棧的“後進先出”的特點。很有代表意義。