• 4.2 实现基于栈的表达式求值计算器(难度4/10)


    本作业主要考察:解释器模式的实现思想/栈结构在表达式求值方面的绝对优势

    C++数据结构与算法夯实基础作业列表

    通过栈的应用,理解特定领域设计的关键作用,给大家眼前一亮的感觉。深刻理解计算机语言和人类语言完美结合的杰作。是作业中的上等作品,是数据结构与算法的典型代表。

    这个作业是我最心爱的一个。因为我有个盗版Win10居然打不开计算器;还有就是一些高级比如指数运算怕不会操作Windows的自带计算器算错,要用自己的计算器再验证一遍;第三个就是Windows的计算器不支持回车键和命令行,我的就可以,回车一下就行,Windows的总是要鼠标点来点去,烦不胜烦。

    需求如下:

    实现表达式求值的计算器,以支持加、减、乘、除、指数幂、括号,6种操作。

    实现代码完成下面的测试用例,要求和预期输出结果一致

    接口提示(可以自行定义接口,只要实现合理,能实现需求就行):

    Stackitem.h

    1. #pragma once
    2. #include //ostream
    3. using namespace std;
    4. template<typename T> class CStack;
    5. template<typename T>
    6. class CStackitem
    7. {
    8. public:
    9. friend class CStack;
    10. CStackitem(void);
    11. CStackitem(T _data);
    12. CStackitem(const CStackitem& _item);
    13. ~CStackitem(void);
    14. const T GetData(void) const;
    15. private:
    16. CStackitem& operator=(const CStackitem& _item);//disallow a = b;
    17. private:
    18. CStackitem* pPre;
    19. CStackitem* pNext;
    20. T data;
    21. };

    Stack.h

    1. #pragma once
    2. #include "Stackitem.h"
    3. template<typename T>
    4. class CStack
    5. {
    6. public:
    7. CStack(void);
    8. CStack(const CStack& _stack);
    9. ~CStack(void);
    10. public:
    11. const T& top(void) const;
    12. bool empty(void) const;
    13. size_t size(void) const;
    14. void push(const CStackitem& _item);
    15. const T pop(void);
    16. private:
    17. CStack& operator=(const CStack& _stack);//a = b; is not allowed
    18. private:
    19. CStackitem* m_pTail;
    20. size_t m_size;
    21. };

    Calculator.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. #include "ExpressionException.h"
    8. typedef list Expression;
    9. ostream& operator<<(ostream& _os, const Expression& _item);
    10. class Calculator
    11. {
    12. public:
    13. Calculator(const char* _infix);
    14. Calculator(const string& _infix);
    15. ~Calculator(void);
    16. public:
    17. string GetExpression(void) const;
    18. void SetExpression(const string& _expression);
    19. template<typename T>
    20. T GetValue(void ) const;
    21. Expression ToPostfix(void) const;
    22. public:
    23. static Expression ToPostfix(const string& pre);
    24. static bool Check(const string& _expression, string& _invalidInfor);
    25. private:
    26. static void ToPostfix(const string& pre, Expression& post);
    27. static bool IsOperator(char op); // 判断是否为运算符
    28. static int Priority(char op); // 求运算符优先级
    29. static void ReadSpace(string::const_iterator& _itr, string::const_iterator& _end);
    30. static void ReadNumber(string::const_iterator& itr, string::const_iterator& _end, string& _value);
    31. private:
    32. string m_infix;
    33. };

    main.cpp

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. #include "Stack.h"
    7. #include "Calculator.h"
    8. void InputAndCalculator(list& listCalculator);
    9. void Output(const list& listCalculator);
    10. void TestAll(list& listCalculator);
    11. int main(int argc, char** argv)
    12. {
    13. cout<<"support: + - * / ^ ( )"<
    14. cout<<"Input 0 for end your input."<
    15. list listCalculator;
    16. InputAndCalculator(listCalculator);//Extra credit 1:(1)any space (2)catch invalid input
    17. return 0;
    18. }
    19. void InputAndCalculator(list& listCalculator)
    20. {
    21. while (true)
    22. {
    23. string sLine, invalidInfor;
    24. getline(cin, sLine);
    25. if (Calculator::Check(sLine, invalidInfor) == false)//Extra credit 1:(1)any space (2)catch invalid input
    26. {
    27. cout<
    28. continue;
    29. }
    30. listCalculator.push_back(sLine);
    31. Output(listCalculator);
    32. listCalculator.clear();
    33. }
    34. }

    参考答案:

    C++表达式求值(Stack and Expression)​

    blog.csdn.net/calmreason/article/details/78163268​编辑

  • 相关阅读:
    手撕红黑树 | 变色+旋转你真的明白了吗?【超用心超详细图文解释 | 一篇学会Red_Black_Tree】
    【深度思考】5年开发经验,不知道git rebase,是否应该被嘲笑?
    PostgreSQL常用指令
    PHP命令行脚本接收传入参数的三种方式
    在golang中使用protoc
    Linux 网络通信
    LeetCode —— 复写零(双指针)
    Redis总结
    iMedicalLIS监听程序(2)
    element plus的icon使用及动态调用
  • 原文地址:https://blog.csdn.net/ClamReason/article/details/132600568