现在又了堆栈类和顺序栈类
以及计算器类
主函数也有
但是运行起来就又错误
不知道如何调试
希望又人能指点下...
代码如下:
//堆栈类
#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. 所有"< <"应改为"<< "。
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. 所有" < <"应改为" << "。
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. 所有"< <"应改为"<< "。
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. 所有" < <"应改为" << "。
3. 所有" < <"应改为" << "。
#5
编辑有问题。我想敲2个紧相连的〈,结果显示出来中间仍有空格,也许原程序中没有这个问题。