求后缀表达式转中缀表达式的代码,请各位大神用栈来解,其他的如树等太过高深,蒟蒻一只不会用。拜托拜托!感激不尽!
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例如后缀表达式 “3 4 + 5 × 6 -”:
(1) 从左至右扫描,将 3和4 压入堆栈;
(2) 遇到 +运算符,因此弹出4和 3(4 为栈顶元素, 3为次顶元素,注意与前缀表达式做比较),计算出 3+4的值,得7 ,再将7入栈;
(3) 将5入栈;
(4) 接下来是 ×运算符,因此弹出5和 7,计算出7×5=35 ,将35入栈;
(5) 将6入栈;
(6) 最后是 -运算符,计算出35-6的值,即 29,由此得出最终结果。
// 计算后缀表达式的结果
public static int toValue(StringBuffer postfix){
Stack<Integer> stack = new Stack<Integer>();
for(int i=0;i<postfix.length();i++){
char ch = postfix.charAt(i);
if(ch>='0' && ch<='9'){
String value ="";
while(ch!= ' '){
value += ch;
ch = postfix.charAt(++i);
}
stack.push(Integer.parseInt(value));
}
else{
if(ch!= ' '){
int y = stack.pop();
int x = stack.pop();
switch(ch){
case '+':stack.push(x+y); break;
case '-': stack.push(x-y) ; break;
case '*': stack.push(x*y); break;
case '/' : stack.push(x/y);break;
}
}
}
}
return stack.pop();
}
如果只是为了将后缀表达式转为中缀表达式,在以上流程中将出栈的数值和符号按照中缀表达式的格式打印出来(或储存为字符串就可以了);
//后缀表达式转化为中缀表达式
public static String postfixToInfix(StringBuilder postfix){
Stack<String> stack = new Stack<String>(); //记录操作数
char sign; //记录前一个操作码
for(int i=0;i<postfix.length();i++){
char ch = postfix.charAt(i);
if(ch>='0' && ch<='9'){
String value ="";
while(ch!= ' '){
value += ch;
ch = postfix.charAt(++i);
}
stack.push(value);
}
else{
if(ch!= ' '){
String y = stack.pop(); //两个操作数出栈
String x = stack.pop();
if((ch == '*' || ch == '/') && (sign == '+' || sign == '-')){
stack.push("("+x+")"+ch+y);
}else{
stack.push(x+ch+y)
}
sign = ch;
}
}
}
}
return stack.pop();
}
之前学数据结构时候弄的,,,没有c++ide了。。你运行试试,不过感觉像是中转后的,,找了会当时课件,,没找到。。
#include<iostream>
#include<exception>
#include<string.h>
using namespace std;
class Out_Bounds:exception{};
class no_means:exception{};
template<class T>
class Stack {
private:
int top;
int MaxTop;
T *stack;
public:
Stack(int Max = 100);
~Stack( ) {delete [ ] stack;}
bool Empty( ) const {return top == -1;}
bool Full( ) const {return top == MaxTop;}
T Top() const;
Stack<T>& Push(const T& x);
Stack<T>& Pop(T& x);
};
template<class T>
Stack<T>::Stack( int Max)
{
MaxTop=Max-1;
stack=new T[Max];
top=-1;
}
template<class T>
T Stack<T>::Top( ) const
{
if(Empty()) throw Out_Bounds();
else return stack[top];
}
template<class T>
Stack<T>& Stack<T>::Push(const T& x)
{
if (Full()) throw no_means( );
stack[++top] = x;
return *this;
}
template<class T>
Stack<T>& Stack<T>::Pop(T& x)
{
if (Empty( )) throw Out_Bounds();
x = stack[top --];
return *this;
}
double Operarte(double b,char op,double a)
{
double c;
switch(op)
{
case '+':
c=b+a;break;
case '-':
c=b-a;break;
case '*':
c=b*a;break;
case '/':
c=b/a;break;
}
return c;
}
bool IsOperator(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return true;
else
return false;
}
char Precede(char a,char b)
{
char c;
switch(a)
{
case '+':
if(b=='+'||b=='-'||b==')'||b=='#')
{
c='>';return c;
}
else if(b=='*'||b=='/'||b=='(')
{
c='<';return c;
}
break;
case '-':
if(b=='+'||b=='-'||b==')'||b=='#')
{
c='>';return c;
}
else if(b=='*'||b=='/'||b=='(')
{
c='<';return c;
}
break;
case '*':
if(b=='+'||b=='*'||b=='-'||b=='/'||b==')'||b=='#')
{
c='>';return c;
}
else if(b=='(')
{
c='<';return c;
}
break;
case '/':
if(b=='+'||b=='/'||b=='-'||b=='*'||b==')'||b=='#')
{
c='>';return c;
}
else if(b=='(')
{
c='<';return c;
}
break;
case '(':
if(b=='+'||b=='-'||b=='*'||b=='/')
{
c='<';return c;
}
else if(b==')')
{
c='=';return c;
}
break;
case '#':
if(b=='+'||b=='-'||b=='*'||b=='/'||b=='('||b==')')
{
c='<';return c;
}
else if(b=='#')
return '=';
break;
}
}
double atof(char c)
{
return c-'0';
}
double EvaluateExpression(string s)
{
Stack<char> optr;
optr.Push('#');
Stack<float> opnd;
char c=s[0],x,op;
int i=0;
float a,b;
while(c!='#'||optr.Top()!='#')
{
if(!IsOperator(c))
{
opnd.Push(atof(c));cout<<c;
c=s[++i];
}
else
switch(Precede(optr.Top(),c))
{
case '<':
optr.Push(c);
cout<<c;c=s[++i];break;
case '=':
optr.Pop(x);cout<<c;c=s[++i];break;
case '>':
optr.Pop(op);
opnd.Pop(a);
opnd.Pop(b);
opnd.Push(Operarte(b,op,a));
break;
}
}
cout<<'=';
return opnd.Top();
}
void transform(string &suffix, string exp)
{
Stack<char>S;
S.Push('#');
int i = 0,j = 0;
char c;
while(!S.Empty())
{
if(!IsOperator(exp[i])) suffix[j++] = exp[i++];
else
{
switch (exp[i])
{
case '(' :
S.Push(exp[i]); break;
case ')' :
S.Pop(c);
while (c!= '(' )
{
suffix[j++] = c; S.Pop( c) ;
}
break;
default :
c=S.Top();
while(S.Top()&&(Precede(c,exp[i])))
{
suffix[j++] = c;
S.Pop(c);
}
if(exp[i] != '#' ) S.Push(exp[i]);
}
if(exp[i] != '#' ) i++;
else S.Pop(exp[i]);
}
}
}
double EvalateSuffix(string suffix)
{
Stack<double> S;
int i = 0;
double e1,e2,e3;
while(suffix[i])
{
if(!IsOperator(suffix[i]))
S.Push( atof(suffix[i++]));
else
{
e3 = Operarte(e2,suffix[i], e1);
S.Push(e3);
i++;
}
}
return e3;
}
int main()
{
int b;
double c,d;
string suffix, exp;
string a="(2+3)*6-4#";
c=EvaluateExpression(a);
cout<<c<<endl;
transform(suffix, a);
d=EvalateSuffix(suffix);
cout<<d<<endl;
return 0;
}