给出一串中缀表达式,1+((2+3)4)-5转成前缀- + 1 * + 2 3 4 5,或者转为后缀
123+45-+,其实转成前缀或者后缀思路是一样的,首先对字符串从左到右遍历设定优先级,±为1,*/为2,括号为0,以转化成前缀表达式为例,前缀的话对输入字符串要从右到左扫描,而后缀刚好相反,是从左到右扫描,遇到数字直接压入结果栈,遇到算符就和算符栈的栈顶元素进行优先级比较,如果算符栈顶的优先级高或者相等,就一直出栈,直到小于位置,再将当前字符压入算符栈顶。如果遇到的是右括号,就压栈,如果遇到左括号,就将算符弹出,直到遇到右括号位为止。字符串遍历完毕,就把算符栈里的所有符号全部弹出加入结果栈,最后对结果栈从后向前遍历输出即可。而前缀转成后缀的思路较为常规,这里就不详细写出。
中缀表达式转前缀表达式
#include<iostream>
#include<string>
using namespace std;
struct node{
string x;
int lev;
};//1+((2+3)*4)-5
node quan[1005];
int setlevel(string s){
int w1=0;
for(int i=0;i<s.length();i++){
if(s[i]=='('||s[i]==')'){
quan[w1].x=s[i];
quan[w1].lev=0;
}
else if(s[i]=='+'||s[i]=='-'){
quan[w1].x=s[i];
quan[w1].lev=1;
}
else if(s[i]=='*'||s[i]=='/'){
quan[w1].x=s[i];
quan[w1].lev=2;
}
else if(s[i]>='0'&&s[i]<='9'){
int j=i;
while(s[j]>='0'&&s[j]<='9'){
j++;
}
quan[w1].x=s.substr(i,j-i);
quan[w1].lev=100;
i=j-1;//因为到最后i还要加一,所以这里的i是j-1
}
w1++;
}
return w1;
}
void resolve(int w1){
node res[100];
node op[100];
int w2=0,w3=0;
op[w3].x="#";
op[w3++].lev=-1;
for(int i=w1-1;i>=0;i--){
if(quan[i].lev==100){
res[w2++]=quan[i];
}
else
{
if(quan[i].x==")")op[w3++]=quan[i];
else if(quan[i].x=="("){
while(op[w3-1].x!=")"){
res[w2++]=op[--w3];
}
w3--;
}
else {
while(quan[i].lev<op[w3-1].lev)
{
res[w2++]=op[--w3];
}
op[w3++]=quan[i];
}
}
}
while(w3!=1){
w3--;
res[w2++]=op[w3];
}
for(int i=w2-1;i>=0;i--)
cout<<res[i].x<<" ";
}
int main(){
string s;
getline(cin,s);
int w1=setlevel(s);
resolve(w1);
}
中缀表达式转后缀表达式
#include<iostream>
#include<string>
using namespace std;
struct node{
string x;
int level;
};//1+((2+3)*4)-5
node quan[1000];
int setquan(string s ){
int w1;
for(int i=0;i<s.length();i++){
quan[w1].x=s[i];
if(s[i]=='('||s[i]==')')
{quan[w1].x=s[i];
quan[w1].level=0;}
else if(s[i]=='+'||s[i]=='-')
{quan[w1].x=s[i];
quan[w1].level=1;}
else if(s[i]=='*'||s[i]=='/')
{quan[w1].x=s[i];
quan[w1].level=2;}
else if(s[i]>='0'&&s[i]<='9'){
int j=i;
while(s[j]>='0'&&s[j]<='9'){
j++;
}
quan[i].x=s.substr(i,j-i);
quan[i].level=100;
i=j-1;
}
w1++;
}
return w1;
}
void solve(int w1){
node op[1000];
int opc=0;
node res[1000];
int resc=0;
op[0].x='0';
op[0].level=-1;
opc++;
for(int i=0;i<w1;i++){
if(quan[i].level==100)
res[resc++]=quan[i];
else{
if(quan[i].x=="(")op[opc++]=quan[i];
else if(quan[i].x==")"){
while(op[opc-1].x!="("){
res[resc++]=op[--opc];
}
opc--;
}
else{
while (quan[i].level<op[opc-1].level)
res[resc++]=op[opc--];
op[opc++]=quan[i];
}
}
}
while(opc!=1){
res[resc++]=op[--opc];
}
for(int i=0;i<resc;i++)
cout<<res[i].x;
}
int main(){
int l;
string s;
getline(cin,s);
l=setquan(s);
solve(l);
return 0;
}