65,210
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
#define STACK_INIT_SIZE 100 // 定义栈的初始大小
#define STACKINCREMENT 10 //定义增量
typedef struct stackd // 定义double型结构体(栈)
{
double *base;
double *top;
int stacksize;
}SqStackd;
void InintStackd(SqStackd &s); //初始化数字栈函数
void Pushd(SqStackd &s,double e); //数字压栈函数
void Popd(SqStackd &s,double &e); //数字出栈函数
double GetTopd(SqStackd s); //数字得到栈顶元素函数
void EvaluateExpression(SqStackd &OPND,SqStackd &OPTR ); //计算器函数
char Precede(double d,char s); //判断符号优先级函数
double Operate(double a,double theata,double b); //运算函数
void main()
{
while(1)
{
SqStackd OPND,OPTR; //定义数字型栈变量
InintStackd(OPND); //初始化数字栈
InintStackd(OPTR); //初始化字符栈
EvaluateExpression(OPND,OPTR ); //计算
}
}
void InintStackd(SqStackd &s) //初始化数字栈函数
{
s.base=(double *)malloc(STACK_INIT_SIZE*sizeof(double)); //分配栈大小
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
void Pushd(SqStackd &s,double e) //数字压栈函数
{
if(s.top-s.base>=s.stacksize) //空间不够时重新分配空间
{
s.base=(double *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(double));
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
}
void Popd(SqStackd &s,double &e) //数字出栈函数
{
if(s.top==s.base)
cout<<"error"<<endl;
e=*(--s.top);
}
double GetTopd(SqStackd s) //数字得到栈顶元素函数
{
if(s.top==s.base)
return 0;
return *--s.top;
}
int StckLenth(SqStackd s) //计算栈中元素个数
{
int i=0;
double * t;
t=s.base;
while(t!=(s.top))
{
t++;
i++;
}
return i;
}
void EvaluateExpression(SqStackd &OPND,SqStackd &OPTR ) //计算器函数
{
char c;
char a[10];
double b,f,flag(0),x,theta;
Pushd(OPTR,'#');
cout<<"请输入表达式 输入‘#’结束"<<endl;
cin>>c;
while((c!='#')||(GetTopd(OPTR)!=35))
{
if((GetTopd(OPTR)==40&&c=='-')||((GetTopd(OPTR)==35)&&c=='-'&&StckLenth(OPND)==0))
flag=1;
else
flag=0;
if((c>='0'&&c<='9')||(c=='.')||flag==1)
{
int i(0);
while((c>='0'&&c<='9')||(c=='.')||flag==1)
{
a[i]=c;
i++;
cin>>c;
flag=0;
}
a[i]='\0';
double q=atof(a);
Pushd(OPND,q);
}//if
else
{
switch(Precede(GetTopd(OPTR),c))
{
case'<' :
Pushd(OPTR,(double)c);
cin>>c;
flag=0;
break;
case '=' :
Popd(OPTR,x);
cin>>c;
flag=0;
break;
case '>' :
Popd(OPTR,theta);
Popd(OPND,b);
Popd(OPND,f);
Pushd(OPND,Operate(f,theta,b));
break;
} //switch
} //else
} //while
cout<<"计算结果为: ";
cout<<GetTopd(OPND)<<endl;
} //EvaluateExpression
char Precede(double d,char s) //判断符号优先级函数
{
char t;
t= (char)d;
if(((t=='+')||(t=='-'))&&((s=='+')||(s=='-')||(s==')')||(s=='#')))
return '>';
else if(((t=='+')||(t=='-'))&&((s=='*')||(s=='/')||(s=='(')))
return '<';
else if(((t=='*')||(t=='/'))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')||(s==')')||(s=='#')))
return '>';
else if(((t=='*')||(t=='/'))&&((s=='(')))
return '<';
else if(((t=='('))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')))
return '<';
else if(((t=='('))&&((s==')')))
return '=';
else if(((t==')'))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')||(s==')')||(s=='#')))
return '>';
else if(((t=='#'))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')||(s=='(')))
return '<';
else if((t=='#')&&(s=='#'))
return '=';
else return 'F';
}
double Operate(double a,double theata,double b) //运算函数
{
char r;
r=(char)theata;
switch(r)
{
case '+' :
return (a+b);
break;
case '-' :
return (a-b);
break;
case '*' :
return (a*b);
break;
case '/' :
if(b!=0)
return (a/b);
else
{
cout<<"除数不能为零"<<endl;
exit(0);
}
break;
}//switch
}
#include <iostream>
using namespace std;
#define STACK_INIT_SIZE 100 // 定义栈的初始大小
#define STACKINCREMENT 10 //定义增量
typedef struct stackd // 定义double型结构体(栈)
{
double *base;
double *top;
int stacksize;
}SqStackd;
typedef struct stackchar //定义char类型的结构体(栈)
{
char *base;
char *top;
int stacksize;
}SqStackchar;
void InintStackd(SqStackd &s); //初始化数字栈函数
void InintStackchar(SqStackchar &s); //初始化符号栈函数
void Pushd(SqStackd &s,double e); //数字压栈函数
void Pushchar(SqStackchar &s,char e); //字符压栈函数
void Popd(SqStackd &s,double &e); //数字出栈函数
void Popchar(SqStackchar &s,char &e); //字符出栈函数
double GetTopd(SqStackd s); //数字得到栈顶元素函数
char GetTopchar(SqStackchar s); //字符的得到栈顶元素函数
void EvaluateExpression(SqStackd &OPND,SqStackchar &OPTR ); //计算器函数
double shuzhizhuanhuan(char * s); //将字符串型转换为double类型函数
char Precede(char d,char s); //判断符号优先级函数
double Operate(double a,char theata,double b); //运算函数
void main(void)
{
while(1)
{
SqStackchar OPTR; //定义字符型栈变量
SqStackd OPND; //定义数字型栈变量
InintStackd(OPND); //初始化数字栈
InintStackchar(OPTR); //初始化字符栈
EvaluateExpression(OPND,OPTR ); //计算
}
}
void InintStackd(SqStackd &s) //初始化数字栈函数
{
s.base=(double *)malloc(STACK_INIT_SIZE*sizeof(double)); //分配栈大小
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
void InintStackchar(SqStackchar &s) //初始化符号栈函数
{
s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); //分配栈大小
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
void Pushd(SqStackd &s,double e) //数字压栈函数
{
if(s.top-s.base>=s.stacksize) //空间不够时重新分配空间
{
s.base=(double *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(double));
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
}
void Pushchar(SqStackchar &s,char e) //字符压栈函数
{
if(s.top-s.base>=s.stacksize) //空间不够时重新分配空间
{
s.base=(char *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char));
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
}
void Popd(SqStackd &s,double &e) //数字出栈函数
{
if(s.top==s.base)
cout <<"error" <<endl;
e=*(--s.top);
}
void Popchar(SqStackchar &s,char &e) //字符出栈函数
{
if(s.top==s.base)
cout <<"error" <<endl;
e=*(--s.top);
}
double GetTopd(SqStackd s) //数字得到栈顶元素函数
{
if(s.top==s.base)
return 0;
return *--s.top;
}
char GetTopchar(SqStackchar s) //字符的得到栈顶元素函数
{
if(s.top==s.base)
return 'F';
return *--s.top;
}
void EvaluateExpression(SqStackd &OPND,SqStackchar &OPTR ) //计算器函数
{
char *c=0;
c=new char[10];
char x,theta;
double flag;
double b,a;
Pushchar(OPTR,'#');
cout <<"请输入表达式 输入‘=’结束" <<endl;
cin>>c;
flag=shuzhizhuanhuan(c);
while((*c!='=')||(GetTopchar(OPTR)!='#'))
{
if(flag!=0)
{
Pushd(OPND,flag);
cin>>c;
flag=shuzhizhuanhuan(c);
}//if
else
{
switch(Precede(GetTopchar(OPTR),*c))
{
case '<' :
Pushchar(OPTR,*c);
cin>>c;
flag=shuzhizhuanhuan(c);
break;
case '=' :
Popchar(OPTR,x);
cin>>c;
flag=shuzhizhuanhuan(c);
break;
case '>' :
Popchar(OPTR,theta);
Popd(OPND,b);
Popd(OPND,a);
Pushd(OPND,Operate(a,theta,b));
break;
} //switch
} //else
} //while
delete []c;
cout <<"hello" <<endl;
cout <<GetTopd(OPND) <<endl;
} //EvaluateExpression
double shuzhizhuanhuan(char *s) //将字符串型转换为double类型函数
{
double i;
i=atof(s);
return i;
}
char Precede(char d,char s) //判断符号优先级函数
{
char t;
t=d;
if(((t=='+')||(t=='-'))&&((s=='+')||(s=='-')||(s==')')||(s=='=')))
return '>';
else if(((t=='+')||(t=='-'))&&((s=='*')||(s=='/')||(s=='(')))
return '<';
else if(((t=='*')||(t=='/'))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')||(s==')')||(s=='=')))
return '>';
else if(((t=='*')||(t=='/'))&&((s=='(')))
return '<';
else if(((t=='('))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')))
return '<';
else if(((t=='('))&&((s==')')))
return '=';
else if(((t==')'))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')||(s==')')||(s=='=')))
return '>';
else if(((t=='#'))&&((s=='+')||(s=='-')||(s=='*')||(s=='/')||(s=='(')))
return '<';
else if((t=='#')&&(s=='='))
return '=';
else
return 'F';
}
double Operate(double a,char theata,double b) //运算函数
{
double ret = 0.0;
switch(theata)
{
case '+' :
ret = (a+b);
break;
case '-' :
ret = (a-b);
break;
case '*' :
ret = (a*b);
break;
case '/' :
ret = (a/b);
break;
default:
break;
}//switch
return ret;
}
int main()
{
char ch, op='#';
double val=0.0;
int done = 0;
while(!done && cin>>ch)
{
switch(ch)
{
case '+': case '-': case '*': case '/':
op = ch;
break; //运算符
case '(': case ')':
break; //括号
case '=':
done = 1;
break; //等号
case ' ': case '\t': case '\r':
break; //空白字符
default:
if( ('0'<= ch && ch <= '9') || '.' == ch )
{
cin.unget(); //操作数,所以回退刚读入的字符
cin>>val; //读入操作数
}
else
{
cerr<<"Unknown char found!"<<endl;
done = 1;
}
break;
}
}
cout<<"op = "<< op <<endl;
cout<<"val = "<< val<<endl;
return 0;
}
#define STACK_INIT_SIZE 100