時間限制:
難度: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.005.53
題解:自己寫了一大堆**結果wa了,至今沒發現錯誤,大神就幾行就a了;論**的靈活性;
借助大神寫的ac:
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
namespace
std;
9double
f()19}20
intmain()
自己的wa:
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
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的整數,它們之間用乙個空格隔開。要求 對於加 減 乘 除這四種運算,分別設計相應的函式來實現。輸入格式 輸入只有一行,即乙個字首表示式字串。...