您的位置:首页 > 其它

表达式求值 中缀式转换成后缀式

2016-02-19 17:14 447 查看
nyoj467

中缀式变成后缀式输出

思路模拟出栈入栈进行计算

将运算符与数字分别存入两个栈中

1 当遇到数字时就直接入栈(数字栈)

2 当运算符栈中为空时 第一个字符要入栈

3 当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)

a 当栈顶元素不为 ( 时 输出

else 就让该运算符入栈(退出循环)

4 当一个运算符的预算等级小于 栈顶运算符时

a 当栈顶为 ) 时 输出

else 入栈

5 最后将运算符栈中的运算符全部用掉

输出

#include<bits/stdc++.h>
using namespace std;
char op[10000];
char s[2000];
int judge(char c)
{
if(c=='+'||c=='-')return 1;
if(c=='/'||c=='*')return 2;
if(c=='(')return 3;
else
return 4;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%s",s);
int top=0;
for(int i=0; s[i]!='=';)
{
if(s[i]>='0'&&s[i]<='9'||s[i]=='.')
{
while(s[i]>='0'&&s[i]<='9'||s[i]=='.')
printf("%c",s[i++]);
printf(" ");
continue;
}
if(top==0)
{
op[++top]=s[i++];
continue;
}
if(judge(op[top])>=judge(s[i]))
{
while(judge(op[top])>=judge(s[i])&&top>0)  //循环判断
{  //排除 5+6*7-9 这一类的情况 输出 5 6 7*+9-
//用if的话会出现 5 6 7* 9 - +;  error
if(op[top]!='(')
printf("%c ",op[top--]);
else
break;
}
op[++top]=s[i];
i++;
}
else
{
if(s[i]==')')
{
while(op[top]!='(')
printf("%c ",op[top--]);
top--;
}
else
op[++top]=s[i];
i++;
}
}
while(top)
printf("%c ",op[top--]);
printf("=\n");
}
}
return 0;
}


nyoj35

表达式求值

思路模拟出栈入栈进行计算

将运算符与数字分别存入两个栈中

1 当遇到数字时就直接入栈(数字栈)

2 当运算符栈中为空时 第一个字符要入栈

3 当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)

a 当栈顶元素不为 ( 时 就进行后续运算

else 就让该运算符入栈(退出循环)

4 当一个运算符的预算等级小于 栈顶运算符时

a 当栈顶为 ) 时 就进行后续运算

else 入栈

5 最后将运算符栈中的运算符全部用掉

#include<bits/stdc++.h>
using namespace std;
char op[10000];
double mi[10000];
char s[10000];
int judge(char c)
{
if(c=='+'||c=='-')return 1;
if(c=='/'||c=='*')return 2;
if(c=='(')return 3;
else
return 4;
}
void  solve(char op[],double mi[],int &tail,int &top)
{   //通过两个栈的出栈与入栈 进行后缀式计算求值
if(op[top]=='+')
mi[tail-1]=mi[tail-1]+mi[tail];
if(op[top]=='-')
mi[tail-1]=mi[tail-1]-mi[tail];
if(op[top]=='*')
mi[tail-1]=mi[tail-1]*mi[tail];
if(op[top]=='/')
mi[tail-1]=mi[tail-1]/mi[tail];
top--;   //字符栈出栈
tail--;    //数字栈出栈
}
int main()
{
int n;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%s",s);
int top=0,tail=0;
for(int i=0; s[i]!='=';)
{
double sum=0;
if(s[i]>='0'&&s[i]<='9'||s[i]=='.')      //数字的入栈
{
while(s[i]>='0'&&s[i]<='9')
{
sum*=10;
sum+=s[i++]-'0';
}
if(s[i]=='.')
{
i++;
double bits=0.1;
while(s[i]>='0'&&s[i]<='9')
{
sum+=bits*(s[i++]-'0');
bits*=0.1;
}
}
mi[++tail]=sum;  //入栈
continue;
}

if(top==0)
{
op[++top]=s[i++];  //运算符的入栈
continue;
}
if(judge(op[top])>=judge(s[i]))
{
while(judge(op[top])>=judge(s[i])&&top>0)
{
if(op[top]!='(')
{
//后缀式计算
solve(op,mi,tail,top);
}
else
break;
}
op[++top]=s[i];
i++;
}
else
{
if(s[i]==')')
{
while(op[top]!='(')
{
//后缀式计算
solve(op,mi,tail,top);
}
top--;
}
else
op[++top]=s[i];
i++;
}
}
while(top)
{
solve(op,mi,tail,top);
}
printf("%.2lf\n",mi[tail]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: