題目中只含有加減乘除,數字可以是浮點數,都是二目運算
這裡的想法很直接,採用鍊錶模擬,但要注意的情況很多(不難乙個乙個分析就好了)
從左向右掃瞄,每次檢查三個
遇到《符號,數字,數字》,直接運算出結果,代替這三個(注意此時,如果下乙個也是數字,就要回到起點再次掃瞄,因為《數字,數字,符號》的模式不存在)
遇到《符號,符號,數字》,跳到第二個符號位置,繼續後移
遇到《符號,數字,符號》,跳到第二個符號位置,繼續檢查
最後只剩乙個結果就是答案。
例如
-+5
*3-3
2*18
-+5*
31*1
8-+5
*318
-+53
8-88
0
#include
#include
#include
using
namespace std;
#define see(x) couttypedef
struct node
}listnode;
class
solsol
(string s)
~sol()
void
init
(string &s)
nowc= s.
at(ptr);if
(isop
(nowc)
)else
rear-
>next = temp;
rear = temp;}}
bool
isop
(char ch)
double
getnumber
(int
&ptr, string &s)
return
atof
(num);}
void
showans()
else
if(p3-
>op !=
'0')
else
} p2 = p1-
>next;
p3 = p2-
>next;}}
printf_s
("%f\n"
,p->data)
;delete p;
}void
update
(listnode*
&p)double
getcalculate
(char op,
double x,
double y)
return ans;
}private
: listnode *m_head;};
intmain()
常規解法,調換方向,從右向左處理
遇到數字就入棧
遇到符號則將棧頂數字出棧計算(注意是先出的op後出的),結果入棧
直到棧裡只有乙個數字
其他都很簡單,有個細節需要注意
當查詢數字傳入的是引用時,在迴圈中容易出現重複加減
例如下面的例子,當x從f2中返回時,他的值是否已經減過1,要小心處理,建議在f2中做乙個恢復操作,在外人看好像,x就自減了一次,就取出了資料。
voidf(
)else
x--;}
}voidf2(
int&x)
x++;//恢復乙個,好像就只操作了乙個x
}
#include
#include
#include
#include
using
namespace std;
#define see(x) coutsolsol
(string s)
~sol()
void
init
(string &s)
else
end--
;//細節
}printf_s
("%f\n"
, nums.
top())
;}bool
isop
(char ch)
double
getcalculate
(char op,
double x,
double y)
return ans;
}double
getnumber
(int
&end, string &s)
end++
;//恢復一下
reverse_
(num, size)
;return
atof
(num);}
void
reverse_
(char
* arr,
int size)
}private:}
;int
main()
字首 波蘭式 中綴 字尾表示式 逆波蘭式
中綴表示式 中綴表示式就是常見的運算表示式,如 3 4 5 6 字尾表示式 字尾表示式又稱逆波蘭表示式,與字首表示式相似,只是運算子位於運算元之後 比如 3 4 5 6 與字首表示式類似,只是順序是從左至右 從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它...
逆波蘭式與表示式求解
逆波蘭式即字尾表示法 預處理 中序表示式 逆序表示式 infix to postfix 演算法 while 表示式非空 if 遇到運算元 直接輸出 else if 遇到操作符op op是 直接入棧s op是 s.push輸出,直到 op是四則運算,則 while 1 if s為空 s.top為 op...
逆波蘭式數學表示式求解
逆波蘭式數學表示式求解 輸入逆波蘭式表示式 include include using namespace std 函式表示式比較str1和str2優先順序 return 1表示str1優先順序高 return 0表示優先順序相等 return 1表示str2優先順序高 intcompare cha...