中缀表达式转为前缀表达式
举例
3 输出 3
1 + 1 输出 (+ 1 1)
2 * 5 + 1 输出 (+ 1 (* 2 5))
2 * ( 5 + 1 ) 输出 (* (+ 1 5) 2)
3 * x + ( 9 + y ) / 4 输出 (+ (* 3 x) (/ (+ 9 y) 4))
这是我现有的代码:
#include<iostream>
#include<string>
using namespace std;
#define maxSize 100
class Stack{
public:
Stack() {top = -1 ; };
bool Push(char a)
{
if(!IsFull())
c[++top] = a;
else
return false;
return true;
}
bool pop(char &a)
{
if(!IsEmpty())
a = c[top--];
else
return false;
return true;
}
bool getTop(char &a)
{
if(!IsEmpty())
a = c[top];
else
return false;
return true;
}
bool IsEmpty()
{
return top == -1 ? true:false ;
}
bool IsFull()
{
return top == (maxSize-1) ? true:false ;
}
private:
char c[maxSize];
int top;
};
int string_length(string s)
{
int n;
for(n=0 ; s[n]!='\0' ; n++); //O(n)
n--;
return n;
}
int priority1(char a) //O(1)
{
if(a == '#')
return 0;
if(a == '(')
return 6;
if(a == '*' || a == '/')
return 4;
if(a == '+' || a == '-')
return 2;
if(a == ')')
return 1;
return false;
}
int priority2(char a)
{
if(a == '#')
return 0;
if(a == '(')
return 1;
if(a == '*' || a == '/')
return 5;
if(a == '+' || a == '-')
return 3;
if(a == ')')
return 6;
return false;
}
char pre_operator(string s, int n)
{
while(s[n] >= '0' && s[n] <= '9' || s[n] =='.')
pre_operator(s, --n);
return s[n];
}
int main()
{
string s;
char c[100];
char a,b;
cout<<"input string "<<endl;
cin>>s;
s = "#"+s;
int m = 0,n;
n = string_length(s);
Stack z;
z.Push('#');
while(n >= 0 && !z.IsEmpty()) //O(n*n)
{
if(isdigit(s[n]))
{//cout<<"n is "<<n<<endl;
z.getTop(a);
if(priority2(pre_operator(s, n)) >= priority1(a)) //O(n)
// if the priority2 of operator right before the s[n] is >= top character in stack,
//we need ')' here
{c[m++] = ')';cout<<"c is "<<pre_operator(s, n)<<endl;}
while(s[n] >= '0' && s[n] <= '9' || s[n] =='.')
c[m++] = s[n--];
c[m++] = ' ';
}
else
{
z.getTop(a);
if(priority1(a) < priority2(s[n]))
{
z.Push(s[n--]);
z.getTop(a);
}
else if(priority1(a) > priority2(s[n]))
z.pop(b) , c[m++] = b;
else
{
z.pop(b);
if(b == ')')
n--;
}
}
}
m--;
cout<<endl<<"prefix string is ";
for( ; m >=0 ; n++,m--) //O(n)
if(c[m] == '+' || c[m] == '-' || c[m] == '*' || c[m] == '/')
cout<<'('<<c[m];
else
cout<<c[m];
cout<<endl;
return 0;
}
问题是 输出的右括号不正确,输入是2+3*2, 输出是 (+ 2(* 3 2)