C++ 简易计算器

介绍:仅支持自然数间的+ - * /操作,并没有括号。

实现:利用栈实现存储运算数以及运算符。

流程:

输入:string exp

对EXP进行处理:数字入数栈,运算符入字符栈。

对字符栈检测,非空时进行:计算

输出:结果。

处理:数字则入数栈,字符就进行判断,

                        1)栈空,字符入栈

                        2)而栈非空

                                    栈顶运算级别> =当前字符运算级,取栈顶运算符并出栈两个数,计算,结果入数栈

                        3)字符入栈

计算:取栈顶运算符并出栈两个数,计算,结果入数栈

栈实现

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):将运算符优先级转为整数,便于比较

int f(const char& c) {
	if (c == '+' || c == '-') return 1;
	else return 2;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值