您的位置:首页 > 其它

中缀表达式转后缀,以及后缀表达式的求值

2016-11-15 14:48 267 查看
#include <cstdio>

#include <stack>

#include <cstring>

#include <ctype.h>

using namespace std;

typedef double YP;

int precede(char ch1,char ch2)

{
if(ch1 == '*'||ch1 == '/')
{
return 0;
}
else if(ch1 == '+'||ch1 == '-')
{
if(ch2  == '*'||ch2 == '/')
return 1;
else if(ch2 == '+'||ch2 == '-')
return 0;
}
else if(ch1 == '(')
return 1;

}

YP calculate(char *shu)

{
int i;
stack<YP> uk;
for(i = 0;i < strlen(shu);i++)
{
if(isdigit(shu[i])) uk.push(shu[i] - '0');
else
{
switch(shu[i])
{
case '+':{
YP a = uk.top();
uk.pop();
YP b = uk.top();
uk.pop();
YP c = b + a;
uk.push(c);
break;
}
case '-':{
YP a = uk.top();
uk.pop();
YP b = uk.top();
uk.pop();
YP c = b - a;
uk.push(c);
break;
}
case '*':{
YP a = uk.top();
uk.pop();
YP b = uk.top();
uk.pop();
YP c = b * a;
uk.push(c);
break;
}
case '/':{
YP a = uk.top();
uk.pop();
YP b = uk.top();
uk.pop();
YP c = b / a;
uk.push(c);
break;
}
default:break;
}
}
}
YP k = uk.top();
uk.pop();
return k;

}

int main()

{
char s[100];
char shu[100];
scanf("%s",s);
stack<char> ck;
int k = 0;

// for(int i = 0;i < strlen(s);i++)

// if(isdigit(s[i]))printf("%c",s[i]);

//

// printf("\n");
for(int i = 0;i < strlen(s);i++)
{
if(isdigit(s[i]))
{
printf("%c",s[i]);
shu[k++] = s[i];
}
else if(s[i] == '(') ck.push(s[i]);
else if(s[i] == ')')
{
char ch  = ck.top();
while(ch != '(')
{
printf("%c",ch);
shu[k++] = ch;
ck.pop();
ch = ck.top();
}
ck.pop();
}
else
{
if(ck.empty()) ck.push(s[i]);
else if(precede(ck.top(),s[i]))
ck.push(s[i]);
else
{
while( !ck.empty() &&!precede(ck.top(),s[i]))
{
printf("%c",ck.top());
shu[k++] = ck.top();
ck.pop();
}
ck.push(s[i]);

}
}
}

while(!ck.empty())
{
printf("%c",ck.top());
shu[k++] = ck.top();
ck.pop();
}

// for(int i = 0;i < k;i++)

// printf("%c",shu[i]);

printf("\n");
printf("%f \n",calculate(shu));
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: