本作業(yè)主要考察:解釋器模式的實現(xiàn)思想/棧結(jié)構(gòu)在表達式求值方面的絕對優(yōu)勢
C++數(shù)據(jù)結(jié)構(gòu)與算法夯實基礎(chǔ)作業(yè)列表
通過棧的應(yīng)用,理解特定領(lǐng)域設(shè)計的關(guān)鍵作用,給大家眼前一亮的感覺。深刻理解計算機語言和人類語言完美結(jié)合的杰作。是作業(yè)中的上等作品,是數(shù)據(jù)結(jié)構(gòu)與算法的典型代表。
這個作業(yè)是我最心愛的一個。因為我有個盜版Win10居然打不開計算器;還有就是一些高級比如指數(shù)運算怕不會操作Windows的自帶計算器算錯,要用自己的計算器再驗證一遍;第三個就是Windows的計算器不支持回車鍵和命令行,我的就可以,回車一下就行,Windows的總是要鼠標點來點去,煩不勝煩。
需求如下:
實現(xiàn)表達式求值的計算器,以支持加、減、乘、除、指數(shù)冪、括號,6種操作。
實現(xiàn)代碼完成下面的測試用例,要求和預(yù)期輸出結(jié)果一致
接口提示(可以自行定義接口,只要實現(xiàn)合理,能實現(xiàn)需求就行):
Stackitem.h
#pragma once
#include <iostream> //ostream
using namespace std;
template<typename T> class CStack;
template<typename T>
class CStackitem
{
public:
friend class CStack<T>;
CStackitem(void);
CStackitem(T _data);
CStackitem(const CStackitem& _item);
~CStackitem(void);
const T GetData(void) const;
private:
CStackitem& operator=(const CStackitem& _item);//disallow a = b;
private:
CStackitem* pPre;
CStackitem* pNext;
T data;
};
Stack.h
#pragma once
#include "Stackitem.h"
template<typename T>
class CStack
{
public:
CStack(void);
CStack(const CStack& _stack);
~CStack(void);
public:
const T& top(void) const;
bool empty(void) const;
size_t size(void) const;
void push(const CStackitem<T>& _item);
const T pop(void);
private:
CStack& operator=(const CStack& _stack);//a = b; is not allowed
private:
CStackitem<T>* m_pTail;
size_t m_size;
};
Calculator.h
#pragma once
#include <iostream>
#include <list>
#include <string>
#include <sstream>
using namespace std;
#include "ExpressionException.h"
typedef list<string> Expression;
ostream& operator<<(ostream& _os, const Expression& _item);
class Calculator
{
public:
Calculator(const char* _infix);
Calculator(const string& _infix);
~Calculator(void);
public:
string GetExpression(void) const;
void SetExpression(const string& _expression);
template<typename T>
T GetValue(void ) const;
Expression ToPostfix(void) const;
public:
static Expression ToPostfix(const string& pre);
static bool Check(const string& _expression, string& _invalidInfor);
private:
static void ToPostfix(const string& pre, Expression& post);
static bool IsOperator(char op); // 判斷是否為運算符
static int Priority(char op); // 求運算符優(yōu)先級
static void ReadSpace(string::const_iterator& _itr, string::const_iterator& _end);
static void ReadNumber(string::const_iterator& itr, string::const_iterator& _end, string& _value);
private:
string m_infix;
};
main.cpp
#include <iostream>
#include <string>
#include <cassert>
#include <list>
using namespace std;
#include "Stack.h"
#include "Calculator.h"
void InputAndCalculator(list<Calculator>& listCalculator);
void Output(const list<Calculator>& listCalculator);
void TestAll(list<Calculator>& listCalculator);
int main(int argc, char** argv)
{
cout<<"support: + - * / ^ ( )"<<endl;
cout<<"Input 0 for end your input."<<endl;
list<Calculator> listCalculator;
InputAndCalculator(listCalculator);//Extra credit 1:(1)any space (2)catch invalid input
return 0;
}
void InputAndCalculator(list<Calculator>& listCalculator)
{
while (true)
{
string sLine, invalidInfor;
getline(cin, sLine);
if (Calculator::Check(sLine, invalidInfor) == false)//Extra credit 1:(1)any space (2)catch invalid input
{
cout<<invalidInfor<<endl;
continue;
}
listCalculator.push_back(sLine);
Output(listCalculator);
listCalculator.clear();
}
}
參考答案:
C++表達式求值(Stack and Expression)?文章來源:http://www.zghlxwxcb.cn/news/detail-693084.html
blog.csdn.net/calmreason/article/details/78163268?編輯文章來源地址http://www.zghlxwxcb.cn/news/detail-693084.html
到了這里,關(guān)于4.2 實現(xiàn)基于棧的表達式求值計算器(難度4/10)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!