字首式計算(字首表示式)

2021-09-08 17:52:50 字數 1822 閱讀 1107

時間限制:

難度:3

描述

先說明一下什麼是中綴式:

如2+(3+4)*5這種我們最常見的式子就是中綴式。

而把中綴式按運算順序加上括號就是:(2+((3+4)*5))

然後把運算子寫到括號前面就是+(2 *( +(3 4) 5) )

把括號去掉就是:+ 2 * + 3 4 5

最後這個式子就是該表示式的字首表示。

給你乙個字首表示式,請你計算出該字首式的值。

比如:+ 2 * + 3 4 5的值就是 37 輸入

有多組測試資料,每組測試資料佔一行,任意兩個操作符之間,任意兩個運算元之間,運算元與操作符之間都有乙個空格。輸入的兩個運算元可能是小數,資料保證輸入的數都是正數,並且都小於10,運算元數目不超過500。 以eof為輸入結束的標誌。

輸出對每組資料,輸出該字首表示式的值。輸出結果保留兩位小數。

樣例輸入

+ 2 * + 3 4 5

+ 5.1 / 3 7

樣例輸出

37.00

5.53

題解:自己寫了一大堆**結果wa了,至今沒發現錯誤,大神就幾行就a了;論**的靈活性;

借助大神寫的ac:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9double

f()19}20

intmain()

自己的wa:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int inf=0x3f3f3f3f;10

#define mem(x,y) memset(x,y,sizeof(x))

11#define si(x) scanf("%d",&x)

12#define pi(x) printf("%d",x)

13#define ll root<<1

14#define rr root<<1|1

15 typedef long

long

ll;16

const

int maxn=10010;17

char

s[maxn];

18char inout(char a,char

b)25

if(a=='

*'||a=='

/')return

'<';

26}27double work(double x,char o,double

y)34}35

void getnum(int& i,double&num)

41if(p==10)num=num*10+s[i]-'0'

;42else num=num+(s[i]-'

0')*p,p*=0.1

;43 i++;44}

45}46int

main()

60double num=0;61

if(isdigit(s[i])||s[i]=='.'

)74}75

else95}

96}97 printf("

%.2lf\n

",s2.top());98}

99return0;

100 }

字首表示式的計算

字首表示式計算演算法補充 字首計算易錯在於迴圈變數是 i不是 i 從後往前掃瞄表示式 如果遇到運算元則入棧 如果遇到操作符則連續出棧兩個元素,進行運算,並將運算結果存入棧中 返回棧頂元素值 小結 字首表示式的計算與字尾類似,唯一區別是字首要從後往前讀,且應當是先取a再取b。include inclu...

字首表示式的計算

字首表示式計算 中綴表示式為 a b c d e 字首表示式為 a bc de 中綴表示式儲存在陣列a中,建立棧stack,從後往前掃,從陣列中取出字元,遇到數字進棧,遇到運算子就出棧兩次,進行計算,計算結果入棧 注意字元型別轉換 include include include define n 1...

字首表示式

編寫乙個程式,以字串方式輸入乙個字首表示式,然後計算它的值。輸入格式為 運算子 物件1 物件2 其中,運算子為 加法 減法 乘法 或 除法 運算物件為不超過10的整數,它們之間用乙個空格隔開。要求 對於加 減 乘 除這四種運算,分別設計相應的函式來實現。輸入格式 輸入只有一行,即乙個字首表示式字串。...