C++实现简易计算器功能

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; }

推荐阅读