- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
//9_9.h
#include iostream #include cmath #include cstdlib #include cstring using namespace std;
enum Boolean {False, True};
#include 9_8.h // 包含栈类模板定义文件
class Calculator //计算器类
{
private:
Stackint S; // 操作数栈
void Enter(int num); //将操作数num 压入栈
//连续将两个操作数弹出栈,放在opnd1 和opnd2 中Boolean GetTwoOperands(int opnd1, int opnd2);
void Compute(char op); //执行由操作符op 指定的运算public:
Calculator(void); //构造函数
void Run(void); //运行计算器程序void Clear(void); //清空操作数栈
};
void Calculator::Enter(int num) // 将操作数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(); }
您可能关注的文档
最近下载
- 2025光伏行业产能过剩内卷竞争现状及未来展望分析报告.pdf
- 中建设计常规做法及指标汇编(2022年,934页).pdf VIP
- 2025年国庆节假期安全教育PPT课件.pptx VIP
- 医疗器械唯一标识管理制度(UDI).docx VIP
- 《成人腰大池引流护理》(TCRHA 069-2024).pdf VIP
- 营销策划 -MINI品牌中国小红书内容种草策略分享-运营思路V2-小红书汽车.pdf
- 中小学生世界粮食日节约粮食主题班会PPT课件.pptx VIP
- 幼儿园保育技能基本功大赛试题.docx VIP
- 土木工程材料1.2 材料与水有关的性质XQ.ppt VIP
- 剑桥KET2025最新考试真题(标准真题版TEST3-阅读和写作部分-含答案及详细解析).pdf VIP
文档评论(0)