C++计算器功能
boy eleven 人气:0介绍
介绍:仅支持自然数间的+ - * /操作,并没有括号。
实现:利用栈实现存储运算数以及运算符。
流程
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; }
加载全部内容