题解 P1175 【表达式的转换】
首先中转后; 之后放在数组里处理; 输出时可以尝试映射; 上代码:
#include<bits/stdc++.h>
using namespace std;
stack<char> s,out;
char yun[1000];
int number[1000];
int main()
{
// freopen("test.txt","r",stdin);
string ms;
cin>>ms;
int i=-1;int op=0;
while(ms[++i]) {
//cout<<"in"<<i<<endl;
if(ms[i]>='0' && ms[i]<='9') {
out.push(ms[i]);
continue;
}
if(ms[i] == '(') {
s.push(ms[i]);
continue;
}
if(ms[i] ==')') {
while(s.top()!='(') {
char n=s.top();
s.pop();
out.push(n);
}
s.pop();
continue;
}
if(ms[i] == '^') {
while(s.size() && s.top() == '^') {
char n = s.top();
out.push(n);
s.pop();
}
s.push(ms[i]);
++op;
continue;
}
if(ms[i] == '*' || ms[i] == '/') {
while(s.size() && (s.top() == '*' || s.top() == '/'||s.top() == '^')) {
char n = s.top();
out.push(n);
s.pop();
}
s.push(ms[i]);
++op;
continue;
}
if(ms[i] == '+' || ms[i] == '-') {
while(s.size() && s.top()!='(') {
char n = s.top();
out.push(n);
s.pop();
}
s.push(ms[i]);
++op;
}
}
while(s.size()) {
char n = s.top();
out.push(n);
s.pop();
}
int z=-1;
while(out.size()) {
char n = out.top();
yun[++z]=n;
if(yun[z]>='0'&&yun[z]<='9') {
number[z]=yun[z]-'0';
yun[z]='@';
}
out.pop();
}
int num;++op;
while(op--) {
num = strlen(yun);
// cout<<"num"<<num<<" ";
for(int i = num-1; i>=0; i--) {
if(yun[i] == '@')
cout<<number[i]<<" ";
else if(yun[i] == '$')
continue;
else
cout<<yun[i]<<" ";
}
cout<<endl;
/* for(int i = num-1; i>=0; i--) {
cout<<yun[i]<<" ";
}
cout<<endl;*/
if(num>1) {
for(int i = num-1; i>=0; i--) {
int j=i,f=0;
switch(yun[i]) {
case '+':{
yun[i]='$';
for(;;j++) {
if(yun[j] == '@')
break;
}
int a1=number[j];
yun[j]='$';
++j;
for(;;j++) {
if(yun[j] == '@')
break;
}
number[j]+=a1;
f=1;
break;
}
case '-':{
yun[i]='$';
for(;;j++) {
if(yun[j] == '@')
break;
}
int a1=number[j];
yun[j]='$';
++j;
for(;;j++) {
if(yun[j] == '@')
break;
}
number[j]-=a1;
f=1;
break;
}
case '*':{
yun[i]='$';
for(;;j++) {
if(yun[j] == '@')
break;
}
int a1=number[j];
yun[j]='$';
++j;
for(;;j++) {
if(yun[j] == '@')
break;
}
number[j]*=a1;
f=1;
break;
}
case '/':{
yun[i]='$';
for(;;j++) {
if(yun[j] == '@')
break;
}
int a1=number[j];
yun[j]='$';
++j;
for(;;j++) {
if(yun[j] == '@')
break;
}
number[j]/=a1;
f=1;
break;
}
case '^':{
yun[i]='$';
for(;;j++) {
if(yun[j] == '@')
break;
}
int a1=number[j];
yun[j]='$';
++j;
for(;;j++) {
if(yun[j] == '@')
break;
}
int s=1;
while(a1--) {
s*=number[j];
}
number[j]=s;
f=1;
break;
}
}
if(f)break;
}
}
// if(s== 2)break;
}
return 0;
}