# 中缀式 变 前缀试，变后缀试,然后表达式求值

412人阅读 评论(0)

/****自己以为自己代码差不多了，做了这道题才知道还远着呢http://acm.nyist.net/JudgeOnline/problem.php?pid=409，擦，吐槽一下，六，七个小时的受不了
*///////
#include<ctype.h>
#include<cstdio>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<iostream>
using namespace std;

int _pri(char s)
{
switch(s)
{
case '=':return -1;break;
case '+':return 0;break;
case '-':return 0;break;
case '*':return 1;break;
case '/':return 1;break;
case '(':return 2;break;
case ')':return 2;break;
}
}
int _using(char c)
{
switch(c)
{
case '+':return -1;break;
case '-':return -2;break;
case '*':return -3;break;
case '/':return -4;break;
}
}
double totly(double *a,int n)
{
stack <double> x;
double sum =0;
for(int i=0;i<n;i++)
{
if(a[i]>=0)
x.push(a[i]);
else
{
double a1 = x.top();
x.pop();
double a2 = x.top();
x.pop();
if(a[i]==-1)
sum=(a1+a2);
else
if(a[i]==-2)
sum=(a2-a1);
else
if(a[i]==-3)
sum=(a2*a1);
else
if(a[i]==-4)
sum=(a2/a1);
x.push(sum);

}
}
return sum;
}
int main()
{
int n,m;
double a[1000];
char _sory[1000];
int icase;
string str,str1;
stack <char> s;
stack <char> s1;
scanf("%d",&icase);
while(icase--){
string nus[1000];
cin>>str;
str1 = str;
n = str1.size();
m = 0;n-= 2;
s1.push('=');
while(n>=0&&!s1.empty()){
if(isdigit(str1[n])||str1[n]=='.'){
while(isdigit(str1[n])||str1[n]=='.')
nus[m] = str1[n--]+nus[m];
m++;
}
else{
if(str1[n]=='('){
while(!s1.empty()&&s1.top()!=')')  {

nus[m++]= s1.top();
s1.pop();
}
n--;
s1.pop();
}
else
if(!s1.empty()&&_pri(s1.top())<=_pri(str1[n])){
s1.push(str1[n--]);

}
else
{

while(!s1.empty()&&_pri(s1.top())>_pri(str1[n])&&s1.top()!=')'){
nus[m++] = s1.top();
s1.pop();

}
s1.push(str1[n--]);
}

}
}

while(!s1.empty()){
nus[m++]= s1.top();
s1.pop();
}
m -= 2;
for(;m>=0;m--)
cout<<nus[m]<<" ";
cout<<"="<<endl;
int cur = 0;
char ch = *str.begin();
while(ch != '=')
{
if(ch<='9'&&ch>='0'){
int cn = 0;
while(ch<='9'&&ch>='0'||ch=='.'){

_sory[cn++] = ch;
str.erase(str.begin());
ch = *str.begin();

}
_sory[cn] = '\0';
cout<<_sory<<" ";
a[cur++] = atof(_sory);
}
else{
if(s.empty())s.push(ch);
else{

if(ch==')')
{

while(!s.empty()&&s.top()!='('){
cout<<s.top()<<" ";
a[cur++] = _using(s.top());
s.pop();
}

if(!s.empty()) s.pop();
}
else
if((_pri(s.top())<_pri(ch)))
s.push(ch);
else
{
while(!s.empty()&&_pri(s.top())>=_pri(ch)&&s.top()!='('){
cout<<s.top()<<" ";
a[cur++] = _using(s.top());
s.pop();
}
s.push(ch);
}

}
str.erase(str.begin());
ch = *str.begin();
}
}
while(!s.empty()){
cout<<s.top()<<" ";
a[cur++] = _using(s.top());
s.pop();
}
cout<<"="<<endl;
printf("%.2lf\n",totly(a,cur));
}
}

0
0

【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐（算法+实战）--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：44032次
• 积分：1373
• 等级：
• 排名：千里之外
• 原创：96篇
• 转载：2篇
• 译文：2篇
• 评论：0条
评论排行