1、基本思路:
先將算術表示式(中綴式)讀入到string物件中,再將其經過相關操作解析並轉換成字尾表示式(存放在一條鍊錶中),最後才(遍歷該鍊錶)對該表示式進行運算。
2、如何支援浮點數的運算:
a、使用atof()函式,它是c語言標準庫中的乙個字串處理函式,功能是把字串轉換成浮點數,其標頭檔案為,該函式名是 "ascii to floating point numbers" 的縮寫。
語法格式為:double atof(const char *nptr)。
b、說明:atof()會掃瞄引數nptr字串,跳過前面的空格字元,直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束時('\0')才結束轉換,並將結果返回。
#include#include#include#includeusing namespace std;
//使用結點node類來儲存運算元或運算子
struct node
};//定義乙個calculator類來存放計算字尾式算術表示式時所需的基本操作
class calculator
double runpostfixexpression(node* head); //執行對字尾式算術表示式的計算
private:
stackst; //存放運算元(double型別)的棧
void addoperand(double value); //運算元進棧
bool get2operands(double& left, double& right); //從棧中取出(退出)兩個運算元
bool dooperator(char op); //使用該運算子進行一次基本算術運算
};double calculator::runpostfixexpression(node* head)
newoperand = st.top();
return newoperand;
}void calculator::addoperand(double operand)
bool calculator::get2operands(double& leftoperand, double& rightoperand)
rightoperand = st.top();
st.pop();
if (st.empty())
leftoperand = st.top();
st.pop();
return true;
}bool calculator::dooperator(char op)
else
break;
} return true;
} else return false;
}//isp(in stack priority)為該算術運算子棧內優先順序
int isp(char c)
}//icp(in coming priority)為該算術運算子棧外優先順序
int icp(char c)
}node* infixtopostfix(string str)
else //處理中綴表示式str中的其他運算元
while (isdigit(str[i]) || str[i] == '.') //過濾掉(跳過)string轉換double時已被使用的那些char字元
}else //如果是運算子,則進行一系列(棧內外)運算子優先順序的比較並結合相關的入棧出棧操作,適時將運算子存入node物件
}else
//棧內運算子優先順序》棧外運算子優先順序,則將棧頂的運算子出棧並將其存入node物件中
else if (isp(charinstack) > icp(str[i]))
//棧內運算子優先順序=棧外運算子優先順序,此時只有一種可能,即棧內的'('/')'的優先順序與棧外的')'/'('優先順序相等且均為1/6,
//即匹配情況為「()」或「)(」,此時直接將棧內的運算子出棧,丟棄當前所掃瞄的str[i] 運算子,繼續掃瞄下乙個運算子
else
}} }
return head;
}int main(void)
return 0;
}
順便附上專案原始碼,支援開源精神,歡迎star、fork:
(希望可以幫到有需要的人~~)
支援浮點數的表示式求值
包含加減乘除,支援括號運算,以及簡單的非法表示式判斷 原理 只有當前操作符的優先順序高於操作符棧棧頂的操作符的優先順序,才入棧,否則彈出操作符以及運算元進行計算直至棧頂操作符的優先順序低於當前操作符,然後將當前操作符壓棧。當所有的操作符處理完畢 即操作符棧為空時 運算元棧中剩下的唯一乙個元素便是最終...
利用棧解析算術表示式
在沒有接觸到棧這種資料結構時,一直覺得用程式計算四則表示式是件相當繁瑣的事。但利用棧,問題就立刻變得容易許多。解析任何包括 和0到9數字組成的算術表示式,並計算其結果。中綴表示式就是通常所說的算術表示式,比如 1 2 3 4。字尾表示式是指通過解析後,運算子在運算數之後的表示式,比如上式解析成字尾表...
浮點資料和泛型表示式測試
總結 1.c規定float為4個位元組,小數點後精度為6位 2.c規定double占用8個位元組,至少精確到小數點後13位 3.long double在32位系統和64位系統中均占用16個位元組 4.佔4位元組或者8位元組,不同系統實現不同 5.bool型別在系統中其實是int型別 6.字元型資料其...