这篇文章主要为大家详细介绍了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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:C++实现简易计算器功能


猜你喜欢
- C语言qsort()函数的使用方法详解 2023-04-26
- Qt计时器使用方法详解 2023-05-30
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言详解float类型在内存中的存储方式 2023-03-27
- Easyx实现扫雷游戏 2023-02-06
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- ubuntu下C/C++获取剩余内存 2023-09-18
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30