求助:帮忙调试下找下错误

时间:2023-02-04 19:25:07
在做一个计算器类的应用程序
现在又了堆栈类和顺序栈类
以及计算器类
主函数也有
但是运行起来就又错误
不知道如何调试
希望又人能指点下...
代码如下: 




//堆栈类
#include <iostream.h>
template <class T>
class Stack
{ //栈类Stack是一个模板抽象类,其成员函数为纯虚函数,未定义数据成员
public:
    virtual bool Push(T x)=0;
virtual bool Pop()=0;
    virtual bool Top(T &x) const=0;
};


//顺序栈类
#include "stack.h"
template <class T>
class SeqStack:public Stack<T>

  public:
    SeqStack(int mSize);
    ~SeqStack() { delete [ ]s; }
    bool IsEmpty() const { return top==-1; }
    bool IsFull() const { return top==maxTop; }
    bool Top(T &x) const;
    bool Push(T x);
    bool Pop();
        void Clear() { top=-1; }
  private:
    int top;                                      //栈顶指针
    int maxTop;                                   //最大栈顶指针
T *s; 
};
template <class T>
SeqStack<T>::SeqStack(int mSize)

maxTop=mSize-1;
      s=new T[mSize];
      top=-1;
}
template <class T>
bool SeqStack<T>::Top(T &x) const

if(IsEmpty()) {
         cout<<"Empty"<<endl; return false;
}
x=s[top];return true;
}
template <class T>
bool SeqStack<T>::Push(T x)

if(IsFull()){                                    //溢出处理
         cout<<"Overflow"<<endl; return false;
    }
   s[++top]=x; return true;
}
template <class T>
bool SeqStack<T>::Pop()

if(IsEmpty()) {                                  //空栈处理
        cout<<"Underflow"<<endl;   return false;
    }
   top--; return true;
}


//计算器类 
#include "seqstack.h"
#include <math.h>
class Calculator
{     
public:
    Calculator(int maxSize):S(maxSize) {}; 
    void Run();                          //从输入流逐个读入字符,做相应的运算,输出结果
    void Clear(){s.Clear();}
private:
    SeqStack<double> s;                  //声明存放操作数的栈对象
    void PushOperand(double);            //操作数进栈
    bool GetOperands(double &, double &);     //从栈中弹出2个操作数
    void DoOperator(char);                     //根据操作符做相应的运算
};
void Calculator::PushOperand(double op)

          s.Push(op);
}
bool Calculator::GetOperands(double &op1, double &op2)  

if (!s.Top(op1)){ 
        cerr<<"Missing operand!"<<endl;  return false;
  }
  s.Pop();
  if (!s.Top(op2)){ 
        cerr<<"Missing operand!"<<endl; return false;
  }
  s.Pop(); return true;
}
void Calculator::DoOperator(char oper)

bool result;
  double oper1,oper2;
  result=GetOperands(oper1,oper2);  //从栈中弹出2个操作数
  if (result)
    switch(oper)                    //根据操作符做相应的运算,先出栈的操作数oper1 
    {                               //放在操作符的右边,后出栈的oper2放在左边
case '+': s.Push(oper2+oper1);  break;
       case '-': s.Push(oper2-oper1);  break;
      case '*': s.Push(oper2*oper1);  break;
      case '/': if (fabs(oper1)<1e-6) {       //如果分母为0,则做出错处理
                cerr<<"Divide by 0!"<<endl;
                  Clear();
            }
             else s.Push(oper2/oper1);break;
      case '^': s.Push(pow(oper2,oper1));break;
    }
  else Clear();
}
void Calculator::Run()

      char c;double newop;
     while (cin>>c,c!='#') {            //从输入流试读入一个字符,遇结束符结束
          switch(c) {                   //读入的字符做如下处理
case '+':
         case '-':
         case '*':
         case '/':
         case '^': DoOperator(c); break;  //是操作符则进行相应的计算
         default: cin.putback(c);   //如不是操作符,则将试读入的字符放回输入流
                cin>>newop;                 //读入一个操作数
                PushOperand(newop); break; //操作数进栈
        }
    } 
    if(S.Top(newop)) cout<<newop<<endl;    //取栈顶元素,得结果输出
}


//主函数
#include"calculator.h"
const int SIZE=20;
void main()
{
    Calculator cal(SIZE);
    cal.Run();

5 个解决方案

#1


今天太晚了,改天再来!!!

#2


学习下

#3


该程序有书写错误,按下面建议修改后即可通过编译和正常运行:

1. 在class Calculator 中:

    Calculator(int maxSize):S(maxSize) {}; 
应为
    Calculator(int maxSize):s(maxSize) {}; //s小写

2. 在void Calculator::Run()中:

    if(S.Top(newop)) cout < <newop < <endl;    //取栈顶元素,得结果输出 
应为
    if(s.Top(newop)) cout << newop << endl;    //取栈顶元素,得结果输出 //s小写

3. 所有"< <"应改为"<< "。




#4


修正3:

3. 所有" < <"应改为" << "。

#5


编辑有问题。我想敲2个紧相连的〈,结果显示出来中间仍有空格,也许原程序中没有这个问题。

#1


今天太晚了,改天再来!!!

#2


学习下

#3


该程序有书写错误,按下面建议修改后即可通过编译和正常运行:

1. 在class Calculator 中:

    Calculator(int maxSize):S(maxSize) {}; 
应为
    Calculator(int maxSize):s(maxSize) {}; //s小写

2. 在void Calculator::Run()中:

    if(S.Top(newop)) cout < <newop < <endl;    //取栈顶元素,得结果输出 
应为
    if(s.Top(newop)) cout << newop << endl;    //取栈顶元素,得结果输出 //s小写

3. 所有"< <"应改为"<< "。




#4


修正3:

3. 所有" < <"应改为" << "。

#5


编辑有问题。我想敲2个紧相连的〈,结果显示出来中间仍有空格,也许原程序中没有这个问题。