⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9-9.h

📁 《c++语言程序设计》例题程序
💻 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 + -