1. 程式人生 > 其它 >資訊學奧賽一本通 1331:字尾表示式的值(evd)

資訊學奧賽一本通 1331:字尾表示式的值(evd)

技術標籤:經驗資料結構

【題目描述】
從鍵盤讀入一個字尾表示式(字串),只含有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; }