改错C++:利用栈实现10进制转换成8进制及后缀表达式的求值0
Sun_惠惠2014.02.04浏览102次分享举报
编译运行一直有问题,不知错在哪里。Stack类的定义写不下了,略,按照课本打上去的,应该没问题
enum Boolean{False,True};
#include
#include
#include
void transfer();
template
class Stack {
public:
Stack ( int=10 ); //构造函数
~Stack ( ) { delete [ ] elements; }//析构函数
void Push ( const Type & item ); //进栈
Type Pop ( ); //出栈
Type GetTop ( ); //取栈顶元素
void MakeEmpty ( ) { top=-1; } //置空栈
int IsEmpty ( ) const { return top == -1; }
int IsFull ( ) const { return top == maxSize-1; }
private:
int top; //栈顶数组指针
Type *elements; //栈数组
int maxSize; //栈最大容量
};
class Calculator
{
public:
Calculator(int sz):s(sz){}
void Run();
void Clear();
double output(){return s.GetTop();}
private:
void AddOperand(double value);
Boolean Get2Operands(double &left,double &right);
void DoOperator(char op);
Stack s;
};
int main()
{
transfer();
Calculator CALC(100);
cout<
CALC.Run();
cout<
CALC.output();
return 0;
}
void Calculator::AddOperand(double value)
{
s.Push(value);
}
Boolean Calculator::Get2Operands(double &left,double &right)
{
if(s.IsEmpty())
{
cerr<
return False;
}
right=s.Pop();
if(s.IsEmpty())
{
cerr<
return True;
}
left=s.Pop();
return True;
}
void Calculator::DoOperator(char op)
{
double left,right;
Boolean result;
result=Get2Operands(left,right);
if(result==True)
switch(op)
{
case'+':s.Push(left+right);break;
case'-':s.Push(left-right);break;
case'*':s.Push(left*right);break;
case'/':if(right==0.0)
{
cerr<
Clear();
}
else s.Push(left/right);break;
case'^':s.Push(pow(left,right));break;
}
else Clear();
}
void Calculator::Run()
{
char ch;
double newoperand;
while(cin>>ch,ch!='=')
{
switch(ch)
{
case'+':case'-':case'*':case'/':case'^':
DoOperator(ch);break;
default:cin.putback(ch);
cin>>newoperand;
AddOperand(newoperand);
break;
}
}
}
void Calculator::Clear()
{
s.MakeEmpty();
}
void transfer()
{
Stack t;
int n;
cout<
cin>>n;
while(n)
{
t.Push(n%8);
n=n/8;
}
while(!t.IsEmpty())
{t.Pop();}
}