rt.
求调
#include<bits/stdc++.h>
using namespace std;
struct node{
bool isc;
int data;
};
int Pow(int i,int j)
{
int ret=1;
for(int k=1;k<=j;k++) ret*=i;
return ret;
}
int F(char c)
{
if(c=='+'||c=='-') return 1;
if(c=='(') return 0;
if(c=='/'||c=='*') return 2;
if(c=='^') return 3;
printf("1145141919810\n");
printf("%c\n",c);
return -114514;
}
int R(char c)
{
return c=='+'||c=='-'||c=='*'||c=='/'||c=='^';
}
void Print(node *a,int i)
{
if(a[i].isc)
printf("%c ",a[i].data);
else
printf("%d ",a[i].data);
}//输出
bool flag;
int len,pos,pos2;
char c[105];
node a[1005];
node b[1005];
stack<char> sta;
int main()
{
scanf("%s",c);
len=strlen(c);
for(int i=0;i<len;i++)
{
if(c[i]>='0'&&c[i]<='9'){
a[++pos].data=c[i]-'0';
a[pos].isc=0;
}
else
{
if(c[i]=='(') sta.push(c[i]);
else if(c[i]==')'){
while(sta.top()!='('){
a[++pos].data=sta.top();
a[pos].isc=1;
sta.pop();
}
sta.pop();
}
else{
while(sta.size()&&F(sta.top())>=F(c[i]))
{
a[++pos].data=sta.top();
a[pos].isc=1;
sta.pop();
}
sta.push(c[i]);
}
}
}
while(sta.size())
{
a[++pos].data=sta.top();
a[pos].isc=1;
sta.pop();
}//以上为中缀转后缀
for(int i=1;i<=pos;i++)
Print(a,i);
printf("\n");
while(1)
{
int j;
flag=false;
for(j=1;j<=pos;j++)
{
if(a[j].isc)
{
flag=true;
//printf("这次操作修改了第%d个符号\n",j);
pos2-=2;
switch(a[j].data)
{
case '+':
b[++pos2].data=a[j-1].data+a[j-2].data;
break;
case '-':
b[++pos2].data=a[j-2].data-a[j-1].data;
break;
case '*':
b[++pos2].data=a[j-2].data*a[j-1].data;
break;
case '/':
b[++pos2].data=a[j-2].data/a[j-1].data;
break;
case '^':
b[++pos2].data=Pow(a[j-2].data,a[j-1].data);
break;
}
b[pos2].isc=0;
break;
}
else{
b[++pos2].data=a[j].data;b[pos2].isc=0;
}
}
if(!flag) break;
j++;
for(;j<=pos;j++){
b[++pos2].data=a[j].data;
b[pos2].isc=a[j].isc;
}//在操作一个符号之后,将这个符号略过并把后面的字符复制过来
for(j=1;j<=pos2;j++){
a[j].data=b[j].data;
a[j].isc=b[j].isc;
Print(a,j);
}//数据转移
printf("\n");
pos=pos2;
pos2=0;
}
return 0;
}