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

来源:互联网 发布:suse11网络配置 编辑:程序博客网 时间:2024/05/24 11:13
#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;
}
0 0