中缀式变成后缀式输出
思路模拟出栈入栈进行计算
将运算符与数字分别存入两个栈中
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;
}
思路模拟出栈入栈进行计算
将运算符与数字分别存入两个栈中
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;
}