满意答案
jdawg316
2014.07.10
采纳率:55% 等级:9
已帮助:1515人
#include
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//-----------------------------------------------------------------------------------------------
class Stack1{//定义字符栈
public:
char * base;
char * top;
int stacksize;
Stack1();
int GetTop(char &e);//取栈顶元素
int Push(char e);//压栈
int Pop(char &e);//跳栈
};
Stack1::Stack1(){
base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
top=base;
stacksize=STACK_INIT_SIZE;
}
int Stack1::GetTop(char &e){
if (top==base) return -1;
else {e=*(top-1);return 0;}
}
int Stack1::Push(char e){
char *new_base=0;
if(top-base>=stacksize)
{
new_base=(char *)realloc(base,(stacksize+STACKINCREMENT)*sizeof(char));
if(!new_base) return -2;
else{
base=new_base;
top=base+stacksize;
stacksize+=STACKINCREMENT;}
}
*top++=e;
return 0;
}
int Stack1::Pop(char &e){
if(top==base) return -1;
e=*--top;
return 0;
}
//----------------------------------------------------------------------------------------------
class Stack2{//定义数字栈
public:
double * base;
double * top;
int stacksize;
Stack2();
int GetTop(double &e);//取栈顶元素
int Push(double e);//压栈
int Pop(double &e);//跳栈
};
Stack2::Stack2(){
base=(double *)malloc(STACK_INIT_SIZE*sizeof(double));
top=base;
stacksize=STACK_INIT_SIZE;
}
int Stack2::GetTop(double &e){
if (top==base) return -1;
e=*(top-1);return 0;
}
int Stack2::Push(double e){
double *new_base=0;
if(top-base>=stacksize)
{
new_base=(double *)realloc(base,(stacksize+STACKINCREMENT)*sizeof(double));
if(!new_base) return -2;
else{
new_base=base;
top=base+stacksize;
stacksize+=STACKINCREMENT;}
}
*top++=e;
return 0;
}
int Stack2::Pop(double &e){
if(top==base) return -1;
e=*--top;
return 0;
}
//------------------------------------------------------------------------------------------------
class Calculator{
private:
bool IsOperand(char ch);//判断ch是否是操作数
bool IsOperator(char ch);//判断ch是否是操作符
char Precede(char op1,char op2);//判断两个操作符优先级的高低
double Operate(double left,char op,double right);//执行运算left op right
int Translate(char op);//将操作符映射到行、列游标
public:
void Run();//执行表达式求值运算
};
bool Calculator::IsOperand(char ch){
if(ch>47&&ch<58) return true;
else return false;
}
bool Calculator::IsOperator(char ch){
if(ch>39&&ch<44||ch==45||ch==47||ch==61) return true;
else return false;
}
char Calculator::Precede(char op1,char op2){
int op10,op20;
op10=op20=0;
op10=Translate(op1);
op20=Translate(op2);
char OP[7][7]={'>','>','','>','>','>','','>','>','>','>','>','','>','>','>','>','>','','>','','>','>','>','e','>','>','
return OP[op10][op20];//将操作符优先级表映射到二维数组
}
double Calculator::Operate(double left,char op,double right){
switch(op)
{
case '+':return (left+right);break;
case '-':return (left-right);break;
case '*':return (left*right);break;
case '/':return (left/right);break;
}
}
int Calculator::Translate(char op){
switch(op)
{
case '+':return 0;break;
case '-':return 1;break;
case '*':return 2;break;
case '/':return 3;break;
case '(':return 4;break;
case ')':return 5;break;
case '=':return 6;break;
}
}
谢谢采纳……
00分享举报