#include <iostreamの> する#include <スタック> の#include <cstio> の#include <CStringの> 使用して 名前空間をSTD。 スタック < フロート > データ; スタック < チャー > 記号。 int型 B [ 5 ] [ 6 ]。 INTの変化(チャーA){ int型symbol_index。 スイッチ(){ ケース ' + ':symbol_index = 1。休憩; ケース " -":symbol_index = 2 ; 休憩; ケース ' * ':symbol_index = 3 ; 休憩; ケース ' / ':symbol_index = 4。休憩; ケース ' @ ':symbol_index = 5 ; 休憩; } 戻りsymbol_index。 } int型のmain(){ memsetの(B、0、はsizeof (b)参照)。 B [ 3 ] [ 1 ] = B [3 ] [ 2 ] = B [ 4 ] [ 1 ] = B [ 4 ] [ 2 ] = B [ 1 ] [ 5 ] = B [ 2 ] [ 5 ] = B [ 3 ] [ 5 ] = B [ 4 ] [ 5 ] = 1 。 文字列A; cinを >> ; symbol.push(' @ ' ); フロートインデックス= 0 。 以下のために(INT iが= 0 ; I <a.lengthを(); I ++ ){ もし([I] == ' #' ){ data.push(インデックス) 休憩; } もし([I] <= ' 9 ' && [I]> = ' 0 ' ){ 指数 * = 10 。 インデックス + = [I] - ' 0 ' 。 } 他{ data.push(インデックス) インデックス = 0 ; int型symbol_index; symbol_index = 変化([I])。 同時に(B [symbol_index] [変更(symbol.top())] == 0 ){ フロート B = data.top()。 data.pop(); フロート A = data.top()。 data.pop(); スイッチ(symbol.top()){ ケース ' + ':data.push(+ b)は、休憩; ケース ' - ':data.push(AB); 休憩; ケース ' / ':data.push(/ B)。休憩; ケース 「* 」:data.push(* B)。休憩; } )(symbol.pop。 } symbol.push([I])。 } } 一方(symbol.top()!= ' @ ' ){ フロート B = data.top()。 data.pop(); フロート A = data.top()。 data.pop(); スイッチ(symbol.top()){ ケース ' + ':data.push(+ b)は、休憩; ケース ' - ':data.push(AB); ブレーク; ケース ' / ':data.push(/ B)。休憩; ケース ' * ':data.push(* B)。休憩; } )(symbol.pop。 } のprintf(" %の.4f " 、data.top())。 リターン 0 ; }
アイデア:{
最初は、再循環を読み取ります{
データの場合、インデックス変数× 10+データ。
もしオペレータ{
最初のインデックスはスタック上にプッシュデータ、その後にインデックスゼロ。
オペレータは、その後、コードオペレータに変換され、表参照1。
次いで、2例:{
1. symbol栈栈顶运算符优先级没此运算符高:直接压栈。
2. 否则取出symbol栈栈顶和data栈栈顶(b)和新的栈顶(取出后栈顶后新的栈顶,即取出前从上往下排第二的元素)(a)进行运算,然后再分两种情况考虑。
}
}
}
然后把剩下的计算完。参见2。
}
犯的错误:{
1. 除法应用float类型,我写成int了。
2. 栈改成int后,其他变量没改。
3. #时,index没入栈。(思路中已纠正)。
}
收获:{
1. 注意类型。
2. 结束时不要想当然地结束循环,而应思考一下还有什么操作。
}