📄 9-9.h
字号:
//9-9.h
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
enum Boolean {False, True};
#include "9-8.h" // 包含栈类模板定义文件
class Calculator //计算器类
{
private:
// private members: calculator stack and operators
Stack<int> S; // 操作数栈
void Enter(int num); //将操作数num压入栈
Boolean GetTwoOperands(int& opnd1, int& opnd2);
//连续将两个操作数弹出栈,放在opnd1和opnd2中
void Compute(char op); //执行由操作符op指定的运算
public:
Calculator(void); //构造函数
void Run(void); //运行计算器程序
void Clear(void); //清空操作数栈
};
// 将操作数num压入栈
void Calculator::Enter(int num)
{
S.Push(num);
}
// 连续将两个操作数弹出栈,放在opnd1和opnd2中
// 如果栈中没有两个操作数,则返回False 并输出相关信息
Boolean Calculator::GetTwoOperands(int& opnd1, int& opnd2)
{
if (S.StackEmpty()) // 检查栈是否空
{
cerr << "Missing operand!" << endl;
return False;
}
opnd1 = S.Pop(); // 将右操作数弹出栈
if (S.StackEmpty()) // 检查栈是否空
{
cerr << "Missing operand!" << endl;
return False;
}
opnd2 = S.Pop(); // 将左操作数弹出栈
return True;
}
// 执行运算
void Calculator::Compute(char op)
{
Boolean result;
int operand1, operand2;
// 将两个操作数弹出栈,并判断成功与否
result = GetTwoOperands(operand1, operand2);
// 如果成功,执行运算并将运算结果压入栈
// 否则清空栈
if (result == True)
{
switch(op)
{
case '+': S.Push(operand2+operand1);
break;
case '-': S.Push(operand2-operand1);
break;
case '*': S.Push(operand2*operand1);
break;
case '/': if (operand1 == 0) //检查除数是否为0
{
cerr << "Divide by 0!" << endl;
S.ClearStack(); //除数为0时清空栈
}
else
S.Push(operand2/operand1);
break;
case '^': S.Push(pow(operand2,operand1));
break;
}
cout<<'='<<S.Peek()<<' '; //输出本次运算结果
}
else
S.ClearStack(); // 操作数不够,清空栈
}
Calculator::Calculator(void)
{}
// 读入并处理后缀表达式
void Calculator::Run(void)
{
char c[20];
while(cin >> c, *c != 'q') // 读入表达式,遇'q'结束
switch(*c)
{
case 'c': S.ClearStack(); //遇'c'清空操作数栈
break;
case '-': //遇'-'需判断是减号还是负号
if (strlen(c)>1) //若字符串长度>1,说明读到的是负数的负号
Enter(atoi(c)); //将字符串转换为整数,压入栈
else
Compute(*c); //若是减号则执行计算
break;
case '+': // 遇到其它操作符时
case '*':
case '/':
case '^':
Compute(*c); //执行计算
break;
default:
// 若读入的是操作数,转换为整型后压入栈
Enter(atoi(c));
break;
}
}
// 清空操作数栈
void Calculator::Clear(void)
{
S.ClearStack();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -