資訊學奧賽一本通 1331:字尾表示式的值(evd)
阿新 • • 發佈:2020-12-22
【題目描述】
從鍵盤讀入一個字尾表示式(字串),只含有0-9組成的運算數及加(+)、減(—)、乘(*)、除(/)四種運算子。每個運算數之間用一個空格隔開,不需要判斷給你的表示式是否合法。以@作為結束標誌。
比如,16–9*(4+3)轉換成字尾表示式為:16□9□4□3□+*–,在字元陣列A中的形式為:
棧中的變化情況:
執行結果:-47
提示:輸入字串長度小於250,參與運算的整數及結果之絕對值均在264範圍內,如有除法保證能整除。
【輸入】
一個字尾表示式。
【輸出】
一個字尾表示式的值。
【輸入樣例】
16 9 4 3 +*[email protected]
【輸出樣例】
-47
【心得】道理很簡單,卻提交了很多次。目前估計問題在於最後一個字元@的判斷,很無解的感覺!
【AC程式碼】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=300;
long long int a[N];
char s[N];
int main()
{
int top=0,ind=0;
gets(s);
while(true)
{
if(s[ind]=='@') break;
switch(s[ind])
{
case '+':top--;a[top-1]=a[top-1]+a[top];break;
case '-':top--;a[top-1]=a[top-1]-a[top];break;
case '*':top--;a[top-1]=a[top-1]*a[top];break;
case '/':top--;a[top-1]=a[top-1]/a[top];break;
default:
{
long long int t=0;
while(s[ind]!=' ')
{
t=10*t+(s[ind]-'0');
ind++ ;
}
a[top++]=t;
break;
}
}
ind++;
}
printf("%lld",a[0]);
return 0;
}