/* Calculator.h */
#ifndef __CALCULATOR_H__
#define __CALCULATOR_H__
#include <iostream.h>
#include "Stack.h"
class Calculator {
private:
//存放操作数的栈
Stack<double> s;
//将一个double型操作数压入栈中
void Enter(double operand) {
s.Push(operand);
}
//从栈顶读取两个操作数
int GetTwoOperands(double &operand1, double &operand2)
{
if (s.StackEmpty()) {
cerr << "No operand to pop!" << endl;
s.ClearStack();
return 0;
}
operand1 = s.Pop();
if (s.StackEmpty()) {
cerr << "No operand to pop!" << endl;
s.ClearStack();
return 0;
}
operand2 = s.Pop();
return 1;
}
//将调用GetTwoOperands读取的两个操作数做运算op
void Compute(char op)
{
double operand1, operand2, result;
if (!GetTwoOperands(operand1, operand2)) return;
switch(op) {
case '+': result = operand1 + operand2; break;
case '-': result = operand1 - operand2; break;
case '*': result = operand1 * operand2; break;
case '/':
if (operand2 == 0) {
cerr << "Divided by 0!" << endl;
s.ClearStack();
return;
}
else result = operand1 / operand2;
break;
}
s.Push(result);
}
//清空操作数栈
void Clear() { s.ClearStack(); }
public:
//构造函数,建立一空栈
Calculator(void) {}
//计算表达式的值
void Run() {
char op;
double operand;
while (1) {
cin >> op;
if (cin.eof()) return;
while (op != '=') {
switch(op) {
case '+': case '-': case '*': case '/':
Compute(op);
break;
default:
cin.putback(op);
cin >> operand;
Enter(operand);
break;
}
cin >> op;
if (cin.eof()) return;
}
cout << s.Pop() << endl;
Clear();
}
}
};
#endif
//////////////////////////////////////////////////////////////////
// Calc.cpp
#include "calc.h"
void main()
{
Calculator c;
c.Run();
}