后缀表达式计算:
#include
#include
#include
#include
using namespace std;
templateclass Stack;
templateclass Node{
T info;
Node*link;
public:
Node(T data=0,Node*next=NULL){
info=data;
link=next;
}
friend class Stack;
};
templateclass Stack{
Node*top;
public:
Stack(){top=NULL;}
~Stack();
void Push(const T &data);
T Pop();
T GetTop();
void MakeEmpty();
bool IsEmpty(){return top==NULL;};
};
templateStack::~Stack(){MakeEmpty();} templatevoid Stack::MakeEmpty(){ Node*temp;
while(top!=NULL){
temp=top;
top=top->link;
delete temp;
};
}
templatevoid Stack::Push(const T&data){ top=new Node(data,top);
}
templateT Stack::Pop(){
assert(!IsEmpty());
Node*temp=top;
T data=temp->info;
top=top->link;
delete temp;
return data;
}
templateT Stack::GetTop(){
assert(!IsEmpty());
return top->info;
}
class Calculator{
StackNstack;
public:
Calculator(void){};
void Cal(void);
void GetTwoNum(int &Num1,int &Num2); void Compute(char Opr);
void Clear(void);
};
void Calculator::Clear(){
Nstack.MakeEmpty();
}
void Calculator::GetTwoNum(int &Num1,int &Num2){ Num1=Nstack.Pop();
Num2=Nstack.Pop();
}
void Calculator::Compute(char Opr){
int Num1,Num2;
if(Opr!='=')GetTwoNum(Num1,Num2);
switch(Opr){
case'+':Nstack.Push(Num2+Num1);break;
case'-':Nstack.Push(Num2-Num1);break;
case'*':Nstack.Push(Num2*Num1);break;
case'/':Nstack.Push(Num2/Num1);break;
case'=':cout
}
void Calculator::Cal(){
bool b1=true,b2=true;
char ch1,str[10];
while(b2){
cin>>ch1;
if(ch1>='0'&&ch1
str[0]=ch1;
str[1]='\0';
Nstack.Push(atoi(str));
}
else {
switch(ch1){
case'c':Clear();break;
case'+':
case'-':
case'*':
case'/':
Compute(ch1);
break;
case'=':
Compute(ch1);
b2=false;
Clear();
break;
};
};
};
}
int main(){
Calculator Calcul;
cout
return 0;
}
后缀表达式计算:
#include
#include
#include
#include
using namespace std;
templateclass Stack;
templateclass Node{
T info;
Node*link;
public:
Node(T data=0,Node*next=NULL){
info=data;
link=next;
}
friend class Stack;
};
templateclass Stack{
Node*top;
public:
Stack(){top=NULL;}
~Stack();
void Push(const T &data);
T Pop();
T GetTop();
void MakeEmpty();
bool IsEmpty(){return top==NULL;};
};
templateStack::~Stack(){MakeEmpty();} templatevoid Stack::MakeEmpty(){ Node*temp;
while(top!=NULL){
temp=top;
top=top->link;
delete temp;
};
}
templatevoid Stack::Push(const T&data){ top=new Node(data,top);
}
templateT Stack::Pop(){
assert(!IsEmpty());
Node*temp=top;
T data=temp->info;
top=top->link;
delete temp;
return data;
}
templateT Stack::GetTop(){
assert(!IsEmpty());
return top->info;
}
class Calculator{
StackNstack;
public:
Calculator(void){};
void Cal(void);
void GetTwoNum(int &Num1,int &Num2); void Compute(char Opr);
void Clear(void);
};
void Calculator::Clear(){
Nstack.MakeEmpty();
}
void Calculator::GetTwoNum(int &Num1,int &Num2){ Num1=Nstack.Pop();
Num2=Nstack.Pop();
}
void Calculator::Compute(char Opr){
int Num1,Num2;
if(Opr!='=')GetTwoNum(Num1,Num2);
switch(Opr){
case'+':Nstack.Push(Num2+Num1);break;
case'-':Nstack.Push(Num2-Num1);break;
case'*':Nstack.Push(Num2*Num1);break;
case'/':Nstack.Push(Num2/Num1);break;
case'=':cout
}
void Calculator::Cal(){
bool b1=true,b2=true;
char ch1,str[10];
while(b2){
cin>>ch1;
if(ch1>='0'&&ch1
str[0]=ch1;
str[1]='\0';
Nstack.Push(atoi(str));
}
else {
switch(ch1){
case'c':Clear();break;
case'+':
case'-':
case'*':
case'/':
Compute(ch1);
break;
case'=':
Compute(ch1);
b2=false;
Clear();
break;
};
};
};
}
int main(){
Calculator Calcul;
cout
return 0;
}