C++實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
本文實(shí)例為大家分享了C++實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能的具體代碼,供大家參考,具體內(nèi)容如下
介紹
介紹:僅支持自然數(shù)間的+ - * /操作,并沒(méi)有括號(hào)。
實(shí)現(xiàn):利用棧實(shí)現(xiàn)存儲(chǔ)運(yùn)算數(shù)以及運(yùn)算符。
流程
1、輸入:string exp
2、對(duì)EXP進(jìn)行處理:數(shù)字入數(shù)棧,運(yùn)算符入字符棧。
1)???,字符入棧
2)棧非空
棧頂運(yùn)算級(jí)別> =當(dāng)前字符運(yùn)算級(jí),取棧頂運(yùn)算符并出棧兩個(gè)數(shù),計(jì)算,結(jié)果入數(shù)棧
3)字符入棧
3、對(duì)字符棧檢測(cè),非空時(shí)進(jìn)行計(jì)算
4、輸出:結(jié)果。
實(shí)現(xiàn)
const int MAXSIZE = 100;//棧的最大大小 template<typename T> class Stack { private: ?? ?T data[MAXSIZE]; ?? ?int top; public: ?? ?Stack(); ?? ?void Push(const T& val); ?? ?T Top()const; ?? ?void Pop(); ?? ?void Clear(); ?? ?bool IsFull()const; ?? ?bool IsEmpty()const; }; template<typename T> Stack<T>::Stack() { ?? ?top = -1; } template<typename T> void Stack<T>::Push(const T& val) { ?? ?if (IsFull()) exit(1); ?? ?//未滿(mǎn) ?? ?data[++top] = val; } template<typename T> T Stack<T>::Top()const { ?? ?if (IsEmpty()) exit(1); ?? ?//非空 ?? ?return data[top]; } template<typename T> void Stack<T>::Pop() { ?? ?if (IsEmpty()) exit(1); ?? ?--top; } template<typename T> void Stack<T>::Clear() { ?? ?top = -1; } template<typename T> bool Stack<T>::IsFull()const { ?? ?return top == MAXSIZE - 1; } template<typename T> bool Stack<T>::IsEmpty()const { ?? ?return top == -1; } ? class Calculator { private: ?? ?Stack<int> num; ?? ?Stack<char> ch;//運(yùn)算符 ?? ? ?? ?bool GetTwoOperands(int& left,int& right); ?? ?void Compute(); ?? ?void Deal(const string& exp); public: ?? ?Calculator() {} ?? ?void Run(); ?? ?void Clear();//清空數(shù)棧以及字符棧 }; void Calculator::Run() { ?? ?string exp; ?? ?cin >> exp; ?? ?Deal(exp); ?? ?while ( !ch.IsEmpty()) { ?? ??? ?Compute(); ?? ?} ?? ?cout << "結(jié)果:" << num.Top() << endl; ?? ?Clear(); } void Calculator::Deal(const string& exp) { ?? ?int i(0), n(exp.length()); ?? ?bool last = false; ?? ?while (i < n&&exp[i] != '=') { ?? ??? ?if (exp[i] >= '0'&&exp[i] <= '9') { ?? ??? ??? ?if (last) { ?? ??? ??? ??? ?int x = num.Top() * 10 + (exp[i] - '0'); ?? ??? ??? ??? ?num.Pop(); ?? ??? ??? ??? ?num.Push(x); ?? ??? ??? ?} ?? ??? ??? ?else { ?? ??? ??? ??? ?num.Push(exp[i] - '0'); ?? ??? ??? ??? ?last = true; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?else { ?? ??? ??? ?last = false; ?? ??? ??? ?while (!ch.IsEmpty()) { ?? ??? ??? ??? ?int i1 = f(ch.Top()); ?? ??? ??? ??? ?int i2 = f(exp[i]); ?? ??? ??? ??? ?if (i1 >= i2) ?? ??? ??? ??? ??? ?Compute(); ?? ??? ??? ??? ?else ?? ??? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ??? ?ch.Push(exp[i]); ?? ??? ?} ?? ??? ?++i; ?? ?} }
計(jì)算:
void Calculator::Compute() ?{ ?? ?bool b; ?? ?int left, right; ?? ?b = GetTwoOperands(left, right); ?? ?if (!b) { ?? ??? ?cout << "Error\n"; ?? ??? ?Clear(); ?? ?} ?? ?else { ?? ??? ?char op = ch.Top(); ?? ??? ?ch.Pop(); ?? ??? ?switch (op) { ?? ??? ?case '+': ?? ??? ??? ?left += right; ?? ??? ??? ?break; ?? ??? ?case '-': ?? ??? ??? ?left -= right; ?? ??? ??? ?break; ?? ??? ?case '*': ?? ??? ??? ?left *= right; ?? ??? ??? ?break; ?? ??? ?case '/': ?? ??? ??? ?if (right == 0) { ?? ??? ??? ??? ?cout << "Error\n"; ?? ??? ??? ??? ?Clear(); ?? ??? ??? ??? ?return; ?? ??? ??? ?} ?? ??? ??? ?left /= right; ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?num.Push(left); ?? ?} } // 將運(yùn)算符優(yōu)先級(jí)轉(zhuǎn)為整數(shù),便于比較 int f(const char& c) { ?? ?if (c == '+' || c == '-') return 1; ?? ?else return 2; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- c++編寫(xiě)簡(jiǎn)單的計(jì)算器程序
- 簡(jiǎn)單實(shí)現(xiàn)C++復(fù)數(shù)計(jì)算器
- C/C++實(shí)現(xiàn)日期計(jì)算器的示例代碼
- C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序
- C/C++經(jīng)典實(shí)例之模擬計(jì)算器示例代碼
- C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
- C++實(shí)現(xiàn)四則混合運(yùn)算計(jì)算器
- C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- C++實(shí)現(xiàn)分?jǐn)?shù)計(jì)算器
- 基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(wèn)題詳解
24點(diǎn)問(wèn)題就是在屏幕上輸入1?10范圍內(nèi)的4個(gè)整數(shù)(可以有重復(fù)),對(duì)它們進(jìn)行加、減、乘、除四則運(yùn)算后(可以任意的加括號(hào)限定計(jì)算的優(yōu)先級(jí)),尋找計(jì)算結(jié)果等于24的表達(dá)式。本文將通過(guò)C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(wèn)題的求解,需要的可以參考一下2021-12-12VC創(chuàng)建進(jìn)程CreateProcess的方法
這篇文章主要介紹了VC創(chuàng)建進(jìn)程CreateProcess的方法,涉及VC操作進(jìn)程的基本技巧,需要的朋友可以參考下2015-05-05C++數(shù)據(jù)結(jié)構(gòu)與算法的基礎(chǔ)知識(shí)和經(jīng)典算法匯總
終是到了標(biāo)志著大二結(jié)束的期末考試了,對(duì)于《算法設(shè)計(jì)與分析》這門(mén)課,我需要總結(jié)一下學(xué)過(guò)的所有算法的思想以及老師補(bǔ)充的關(guān)于兩個(gè)復(fù)雜度和遞歸的概念思想,以及更深層次的理解,比如用畫(huà)圖的方式表達(dá)出來(lái),我覺(jué)得可以用博客記錄總結(jié)一下,分享給大家,希望能有所幫助2022-05-05C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C語(yǔ)言-I/O流設(shè)計(jì)實(shí)驗(yàn)
編程語(yǔ)言的I/O類(lèi)庫(kù)中常常使用流這個(gè)抽象的概念,它代表任何有能力產(chǎn)生數(shù)據(jù)的數(shù)據(jù)源對(duì)象或時(shí)有能力接收數(shù)據(jù)的接收端對(duì)象,本文為大家介紹C語(yǔ)言中I/O系統(tǒng)基礎(chǔ)知識(shí)2021-07-07C++實(shí)現(xiàn)LeetCode(98.驗(yàn)證二叉搜索樹(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(98.驗(yàn)證二叉搜索樹(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07