完成度更高的有括號版本c++實現四則運算器(有括號)
對於無括號的計算器,實現起來比較容易,下面讓我們一步步實現。
舉例首先明確需要實現怎樣的程式,對於無括號的計算器,大概做成這樣就可以了:
52+34*3-4/2=分析
對於例子中的表示式,由於乘除運算的優先順序高於加減運算,我們不能直接從左到右進行。但四則運算的規則是從左到右,先乘除後加減,對於優先順序相同的運算子還是可以從左到右運算的。
因此我們可以每讀到乙個運算子時,檢查前乙個運算子的優先順序,如果前乙個運算子的優先順序與當前運算子相等或更高,那麼我們便可以完成前乙個運算子的計算;反之,則不進行運算。這樣一來就需要將之前的運算子以及運算子左右的數儲存起來,由於我們每次都是取前乙個運算子,符合後進先出的條件,故可以選擇棧來儲存資料和符號。最好將資料和符號分開儲存,這裡為了簡便(整數棧即可儲存數字也可儲存字元),只實現整數的四則運算,若需要浮點數的運算,稍加修改即可。
首先,實現乙個棧的類,或者直接使用stl
#ifndef stack_h
#define stack_h
#includeclass stack_int
; stack_int(unsigned int capacity) :bottom(new int[capacity+1]),top(bottom), capacity(capacity),size(0){};
int operator(unsigned int i) const
bool isempty()const
bool isfull()const
unsigned int getsize()const
unsigned int getcapacity()const
int gettop()const
void settop(int i) }
void push(int i)
else
}private:
void stack_expansion()
bottom = newbottom;
top = newtop;
capacity = newcapacity;
}};#endif
然後在我們的主程式中利用棧來分析四則運算的規律(源**如下)
#include"stack.h"
#includeusing namespace std;
bool is_digit(char i)
bool is_operator(char i)
bool get_priority(char pre,char cur)
int do_operation(int lnum, char ope, int rnum)
/*1+2*3=
1+5*4-345+36/6*4+145*4*5-52=
*/int main()
num_stack.push(num);
//cout <<"the number is " 《這裡需要注意一些問題,首先,由於整數可能是多位數,因此在遇到乙個數字符號時,我們可以通過迴圈將後面幾位全部找出,並將符號轉化為真正的數值。
第二個問題就是有時候會出現表示式解析到等號了,卻有很多數沒進行運算,解決這個問題的方法就是在
if (is_operator(current_char))
中使用while迴圈,並將迴圈條件設定為棧非空且棧頂運算子優先順序高於當前讀入的運算子(前提是=的優先順序小於任何運算子)
while((!ope_stack.isempty())&&(get_priority((char)ope_stack.gettop(),current_char)))
C 實現四則運算器 帶括號
基本分析可以看另一篇文章c 實現四則運算器 無括號 棧的實現 ifndef stack h define stack h includeclass stack int stack int unsigned int capacity bottom new int capacity 1 top bott...
C 四則運算器
leetcode上的題,只有 空格,計算所給表示式的數值 我現在用的辦法是 中綴表示式轉字尾表示式,然後計算 但是leetcode最後乙個示例是長度為20w的表示式,直接給我弄超時了,先把 放在這裡吧 計算器 include include include includeusing namespac...
分數四則運算器
好的,先弄出個類來,如下 view code 1 class fraction2 各成員實現如下 view code 1 建構函式 2fraction fraction intx,inty 310 denominator y 11 1213 fraction fraction 1417 加法 18c...