本文实例为大家分享了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;
}