📄 计算器.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define MAX 100
////////////////////////////////////////////////
typedef struct Snode1{
float data;
struct Snode1 *next;
}Snode1,*LSnode1;
typedef struct Snode2{
char data;
struct Snode2 *next;
}Snode2,*LSnode2;
///////////////////////////////////////////
void InitStack1(LSnode1 &S)
{
S=NULL;
}
void InitStack2(LSnode2 &S)
{
S=NULL;
}
void Push1(LSnode1 &S,float e)
{
LSnode1 p;
p=new Snode1;
p->data=e;
p->next=S;
S=p;
}
void Push2(LSnode2 &S,char e)
{
LSnode2 p;
p=new Snode2;
p->data=e;
p->next=S;
S=p;
}
bool Pop1(LSnode1 &S,float &f)
{
if(S)
{
LSnode1 p;
p=S;
S=S->next;
f=p->data;
delete p;
return TRUE;
}
else return FALSE;
}
bool Pop2(LSnode2 &S,char &f)
{
if(S)
{
LSnode2 p;
p=S;
S=S->next;
f=p->data;
delete p;
return TRUE;
}
else return FALSE;
}
bool StackEmpty(LSnode2 S)
{
if(!S) return TRUE;
else return FALSE;
}
bool GetTop(LSnode2 S,char &e)
{
if(S)
{
e=S->data;
return TRUE;
}
else return FALSE;
}
///////////////////////////////////////////////////
bool OpMember(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#'||ch=='('||ch==')') return TRUE;
else return FALSE;
}
float Operate(float s1,char ch,float s2)
{
//cout<<s1<<ch<<s2<<endl<<endl;
switch(ch)
{
case '+':cout<<s1<<s2<<(s1+s2)<<endl<<endl;return (s1+s2);
case '-':cout<<s1<<s2<<(s1-s2)<<endl<<endl;return s1-s2;
case '*':return s1*s2;
case '/':return s1/s2;
}
}
bool precede(char ch1,char ch2)
{
int a,b;
switch(ch1)
{
case '#':a=-1;
case '(':a=0;break;
case '+':a=1;break;
case '-':a=1;break;
case '*':a=2;break;
case '/':a=2;break;
case ')':a=2;break;
}
switch(ch2)
{
case '#':b=-1;
case '(':b=0;break;
case '+':b=1;break;
case '-':b=1;break;
case '*':b=2;break;
case '/':b=2;break;
case ')':b=2;break;
}
return (a>=b);
}
///////////////////////////////////////////////////
double evaluation(char suffix[])
{
char ch;
char a,b,result;
struct Snode2 *S;
ch=*suffix++;
InitStack2(S);
while(ch!='#')
{
if(!OpMember(ch)) Push2(S,ch);
else
{
Pop2(S,b);
Pop2(S,a);
Push2(S,Operate(a,ch,b));
}
ch=*suffix++;
}
Pop2(S,result);
return result;
}
void transform(char suffix[MAX],char exp[MAX])
{
char *p;
char ch;
char c;
int k;
struct Snode2 *S;
InitStack2(S);
Push2(S,'#');
p=exp;
ch=*p;
k=0;
while(!StackEmpty(S))
{
if(!OpMember(ch)) suffix[k++]=ch;
else
{
switch(ch)
{
case '(':Push2(S,ch);break;
case ')':
{
Pop2(S,c);
while(c!='(')
{
suffix[k++]=c;
Pop2(S,c);
}
break;
}
default:
{
while(GetTop(S,c)&&(precede(c,ch)))
{
suffix[k++]=c;
Pop2(S,c);
}
if(ch!='#') Push2(S,ch);
break;
}
}
}
if(ch!='#') ch=*(++p);
}
suffix[k]='\0';
}
//////////////////////////////////////////////////////
void main()
{
int i=-1;
double result;
char a[MAX];
char suffix[MAX];
cout<<"请输入计算式:";
do
{
i++;
cin>>a[i]; //cout<<a[i];
}while(a[i]!='#');//cout<<a<<endl<<endl<<endl;cout<<suffix<<endl<<endl;
transform(suffix,a);cout<<suffix[0]<<suffix[1]<<suffix[2]<<suffix[3]<<suffix[4]<<suffix[5]<<suffix[6]<<suffix[7]<<suffix[8]<<suffix[9]<<suffix[10]<<suffix[11];
result=evaluation(suffix);
cout<<"计算结果是:"<<result<<endl;
}
/*void main()
{
float a,b,result;
int k,i,j,s;
char ch,suffix[MAX],a[MAX];
char *p,*q,d;
float c[MAX],n,m,m1,m2,m3;
LSnode1 S;
//j=1;
cin>>a[0];
for(i=0;a[i]!='#';) cin>>a[++i];
a[i+1]='\0';
k=0;s=0;m=0;m1=0;m2=0;m3=1.0;
transform(suffix,a);p=q=suffix;
ch=*p;
Initstack1(S);
while(ch!='#')
{
q=p;
if(!OpMember(ch))
{
if(!OpMember(*++q))
{
d=ch;
c[k++]=d-48;
}
else
{
d=ch;
c[k++]=d-48;
while(s<k)
{
for(i=s;c[i]!=(-15)&&c[i]!=(-2);i++) m1=10*m1+c[i];
if(c[i]==-2)
{
for(i=i+1;c[i]!=-15;i++) {m3=m3*10;m2=m2+c[i]/m3;}
}
m=m1+m2;
s=i+1;
Push1(S,m);
m2=0;m=0;m1=0;m3=1.0;
}
}
ch=*++p;
}
else
{
Pop(S,b);Pop(S,a);
if(b!=0)
{
Push1(S,Operate(a,ch,b));
ch=*++p;
}
else
{
if(ch!='/')
{
Push1(S,Operate(a,ch,b));
ch=*++p;
}
else
{
cout<<"MessageError";
ch='#';
push(S,0);
}
}
}
Pop1(S,result);
n=result;
cout<<n<<endl;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -