C++实现简易计算器功能
更新时间:2022年02月07日 15:36:41 作者:boy eleven
这篇文章主要为大家详细介绍了C++实现简易计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C++实现简易计算器功能的具体代码,供大家参考,具体内容如下
介绍
介绍:仅支持自然数间的+ - * /操作,并没有括号。
实现:利用栈实现存储运算数以及运算符。
流程
1、输入:string exp
2、对EXP进行处理:数字入数栈,运算符入字符栈。
1)栈空,字符入栈
2)栈非空
栈顶运算级别> =当前字符运算级,取栈顶运算符并出栈两个数,计算,结果入数栈
3)字符入栈
3、对字符栈检测,非空时进行计算
4、输出:结果。
实现
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); //未满 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;//运算符 bool GetTwoOperands(int& left,int& right); void Compute(); void Deal(const string& exp); public: Calculator() {} void Run(); void Clear();//清空数栈以及字符栈 }; void Calculator::Run() { string exp; cin >> exp; Deal(exp); while ( !ch.IsEmpty()) { Compute(); } cout << "结果:" << 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; } }
计算:
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); } } // 将运算符优先级转为整数,便于比较 int f(const char& c) { if (c == '+' || c == '-') return 1; else return 2; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
马尔可夫链算法(markov算法)的awk、C++、C语言实现代码
这篇文章主要介绍了马尔可夫链算法(markov算法)的awk、C++、C语言实现代码,需要的朋友可以参考下2014-08-08C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法
这篇文章主要介绍了C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法,需要的朋友可以参考下2014-07-07
最新评论