📄 运算符栈运算.txt
字号:
#include"iostream"
#include"sstream"
#include"string"
using namespace std;
int bijiao[8][8]={3,3,1,1,1,1,3,3,
3,3,1,1,1,1,3,3,
3,3,3,3,3,1,3,3,
3,3,3,3,3,1,3,3,
3,3,3,3,3,1,3,3,
1,1,1,1,1,1,2,2,
3,3,3,3,3,0,3,3,
1,1,1,1,1,1,0,2};
struct zhanshu
{
double shu;
zhanshu * next;
zhanshu()
{
shu=0;
next=NULL;
}
};
//--------------------------------------------
struct zhanfu
{
char fu;
zhanfu * next;
zhanfu()
{
fu='#';
next=NULL;
}
};
zhanshu *jinzhanshu(zhanshu* &top,double a)
{ cout<<"shu运行";
zhanshu* jiedian;
jiedian=new zhanshu;
jiedian->shu=a;
jiedian->next=top;
top=jiedian;
return top;
}
zhanshu * chuzhanshu(zhanshu * &top,double &a)
{ zhanshu * temp;
temp=top;
a=top->shu;
top=top->next;
delete temp;
return top;
}
//------------------------------------------------
zhanfu * jinzhanfu(zhanfu * &top,char a)
{ cout<<"fu运行";
zhanfu * jiedian;
jiedian=new zhanfu;
jiedian->fu=a;
jiedian->next=top;
top=jiedian;
return top;
}
zhanfu * chuzhanfu(zhanfu * &top,char &a)
{
zhanfu * temp;
temp=top;
a=top->fu;
top=top->next;
delete temp;
return top;
}
//----------------------------------------------
int panduanzifu(zhanfu * &b,char &a)
{
int m,n;
char e;
e=b->fu;
switch (a)
{
case '+':
m= 0;
break;
case '-':
m= 1;
break;
case '*':
m= 2;
break;
case '/':
m= 3;
break;
case '%':
m= 4;
break;
case '(':
m= 5;
break;
case ')':
m= 6;
break;
case '#':
m= 7;
break;
}
switch (e)
{
case '+':
n= 0;
break;
case '-':
n= 1;
break;
case '*':
n= 2;
break;
case '/':
n= 3;
break;
case '%':
n= 4;
case '(':
n= 5;
break;
case ')':
n= 6;
break;
case '#':
n= 7;
break;
}
return bijiao[n][m] ;
}
//----------------------------------------
double yunsuan (zhanfu* & a,zhanshu * & b )
{
char c;
double d,e;
chuzhanfu(a,c);
chuzhanshu(b,d);
chuzhanshu(b,e);
switch (c)
{
case '+':
return d+e;
case '-':
return e-d;
case '*':
return d*e;
case '/':
return e/d;
}
}
main()
{
char a[100];
cout<<"请输入表达式";
cin>>a;
zhanshu* topshu=NULL;
zhanfu * topfu=NULL;
jinzhanfu(topfu,'#'); //----------------------压入#
//---------------------------------------------------
for(static int i=0;a[i]!='\0';)
{
if (a[i]>47)
{
string * s;
s=new string;
for(int j=i;a[j]>47 && a[j]!='#';j++)
{
*s=*s+a[j];
i++;
}
double shu;
stringstream shuchu(*s);
shuchu>>shu;
jinzhanshu(topshu,shu) ; //-------------------把字符转换成数
}
else
if (a[i]<48)
{
if (panduanzifu(topfu,a[i])==1) //--------------第二个变量与第一个变量比较 第二个变量比第一个变量优先级低
{jinzhanfu(topfu,a[i]) ;i++;}
else
if (panduanzifu(topfu,a[i])==3) //----------第二个变量比第一个变量优先级高
jinzhanshu(topshu,yunsuan(topfu,topshu));
else
if (panduanzifu(topfu,a[i])==2 && a[i]!=')')
{i++;} //---------------第二个变量比第一个变量优先级相同
else
if (panduanzifu(topfu,a[i])==2 && a[i]==')')
{ char h;
chuzhanfu(topfu,h); //---------------'('出栈
i++;
}
}
}
cout<<topshu->shu ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -