清华大学出版社出版的c++程序设计课本

源代码在线查看: 9_9.h

软件大小: 172 K
上传用户: zln12345
关键词: 清华大学 出版社 程序设计
下载地址: 免注册下载 普通下载 VIP

相关代码

				//9-9.h
				#include 
				#include 
				#include 
				#include 
				
				enum Boolean {False, True};
				#include "9-8.h"             // 包含栈类模板定义文件
				
				class Calculator     //计算器类
				{
				    private:
				        // private members: calculator stack and operators
				        Stack 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 				        return False;
				    }
				    opnd1 = S.Pop();            // 将右操作数弹出栈
				    if (S.StackEmpty())        // 检查栈是否空
				    {
				        cerr 				        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 				                            S.ClearStack();       //除数为0时清空栈
				                        }
				                        else
				                            S.Push(operand2/operand1);
				                        break;
				                        
				            case '^':   S.Push(pow(operand2,operand1));
				                        break;
						}
						cout				    }
				    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();
				}
							

相关资源