操作数 写至输出
左括号 推入栈
右括号 栈非空时,重复以下步骤
弹出一项,
若不为左括号,则opTop写至输出
若为左括号,则退出循环
当前读取的操作符opThis 若栈为空,则存入栈
若非空,重复以下步骤
弹出一项opTop
若为左括号,则左括号和当前操作符都存入栈,退出循环
若为操作符,且
若opTop>=opThis,则opTop存入栈,输出opThis
若opTop<opThis 则输出opTop
没有更多项 当栈非空时,弹出项目,将其输出
public String doTrans() // do translation to postfix
{
for (int j = 0; j < input.length(); j++) // for each char
{
char ch = input.charAt(j); // get it
theStack.displayStack("For " + ch + " "); // *diagnostic*
switch (ch) {
case '+': // it's + or -
case '-':
gotOper(ch, 1); // go pop operators
break; // (precedence 1)
case '*': // it's * or /
case '/':
gotOper(ch, 2); // go pop operators
break; // (precedence 2)
case '(': // it's a left paren
theStack.push(ch); // push it
break;
case ')': // it's a right paren
gotParen(ch); // go pop operators
break;
default: // must be an operand
output = output + ch; // write it to output
break;
} // end switch
} // end for
while (!theStack.isEmpty()) // pop remaining opers
{
theStack.displayStack("While "); // *diagnostic*
output = output + theStack.pop(); // write to output
}
theStack.displayStack("End "); // *diagnostic*
return output; // return postfix
}
public void gotOper(char opThis, int prec1) { // got operator from input
while (!theStack.isEmpty()) {
char opTop = theStack.pop();
if (opTop == '(') // if it's a '('
{
theStack.push(opTop); // restore '('
break;
} else // it's an operator
{
int prec2; // precedence of new op
if (opTop == '+' || opTop == '-') // find new op prec
prec2 = 1;
else
prec2 = 2;
if (prec2 < prec1) // if prec of new op less
{ // than prec of old
theStack.push(opTop); // save newly-popped op
break;
} else
// prec of new not less
output = output + opTop; // than prec of old
} // end else (it's an operator)
} // end while
theStack.push(opThis); // push new operator
}
public void gotParen(char ch) { // got right paren from input
while (!theStack.isEmpty()) {
char chx = theStack.pop();
if (chx == '(') // if popped '('
break; // we're done
else
// if popped operator
output = output + chx; // output it
} // end while
} // end popOps()124+5*+
// --------------------------------------------------------------
} // end class InToPost