中缀表达式转前缀表达式和转后缀表达式思路大体一样,只不过有些细节需要处理, 下面来说一下。
因为是前缀表达式,所以要从后往前枚举,遇到数直接输出,遇到 ) ) ) 压入栈,遇到 ( ( ( 开始弹出栈中元素,直到遇到第一个 ) ) ) 时结束。
最后把栈中剩余元素依次弹出即可。
注:所有输出的元素先用一个数组存起来,然后逆序输出,才是一个前缀表达式。
C o d e Code Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
char s[100],ss[100];
stack<int> q;
int t;
int main()
{
scanf("%s",s);
for(int i=strlen(s)-1;i>=0;i--){
if(s[i]!='('){
if(s[i]>='0'&&s[i]<='9'){
ss[++t]=s[i];
continue;
}
else
q.push(s[i]);
}
else{
while(1){
char p=q.top();
q.pop();
if(p==')')
break;
if(p!='('&&p!=')')
ss[++t]=p;
}
}
}
while(!q.empty()){
if(q.top()!='('&&q.top()!=')')
ss[++t]=q.top();
q.pop();
}
for(int i=t;i>=1;i--)
cout<<ss[i]<<' ';
return 0;
}
//1+((2+3)*4)-5
//- + 1 * + 2 3 4 5