java数据结构七、通过栈实现中缀表达式转换成后缀表达式

//infix.java
//converts infix arithmetic expressions to postfix
//to run this program: C>java InfixApp
import java.io.*;            // for I/O

class StackX
{
private int maxSize;
private char[] stackArray;
private int top;
//--------------------------------------------------------------
public StackX(int s)       // constructor
   {
   maxSize = s;
   stackArray = new char[maxSize];
   top = -1;
   }
//--------------------------------------------------------------
public void push(char j)  // put item on top of stack
   { stackArray[++top] = j; }
//--------------------------------------------------------------
public char pop()         // take item from top of stack
   { return stackArray[top--]; }
//--------------------------------------------------------------
public char peek()        // peek at top of stack
   { return stackArray[top]; }
//--------------------------------------------------------------
public boolean isEmpty()  // true if stack is empty
   { return (top == -1); }
//-------------------------------------------------------------
public int size()         // return size
   { return top+1; }
//--------------------------------------------------------------
public char peekN(int n)  // return item at index n
   { return stackArray[n]; }
//--------------------------------------------------------------
public void displayStack(String s)
   {
   System.out.print(s);
   System.out.print("Stack (bottom-->top): ");
   for(int j=0; j<size(); j++)
      {
      System.out.print( peekN(j) );
      System.out.print(' ');
      }
   System.out.println("");
   }
//--------------------------------------------------------------
}  // end class StackX

class InToPost                  // infix to postfix conversion
{
private StackX theStack;
private String input;
private String output = "";
//--------------------------------------------------------------
public InToPost(String in)   // constructor
   {
   input = in;
   int stackSize = input.length();
   theStack = new StackX(stackSize);
   }
//--------------------------------------------------------------
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
   //读完input,输出栈中所有操作符
   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
   }  // end doTrans()
//--------------------------------------------------------------
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
   }  // end gotOp()
//--------------------------------------------------------------
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()
//--------------------------------------------------------------
}  // end class InToPost

class InfixApp
{
public static void main(String[] args) throws IOException
   {
   String input, output;
   while(true)
      {
      System.out.print("Enter infix: ");
      System.out.flush();
      input = getString();         // read a string from kbd
      if( input.equals("") )       // quit if [Enter]
         break;
                                   // make a translator
      InToPost theTrans = new InToPost(input);
      output = theTrans.doTrans(); // do the translation
      System.out.println("Postfix is " + output + '\n');
      }  // end while
   }  // end main()
//--------------------------------------------------------------
public static String getString() throws IOException
   {
   InputStreamReader isr = new InputStreamReader(System.in);
   BufferedReader br = new BufferedReader(isr);
   String s = br.readLine();
   return s;
   }
//--------------------------------------------------------------
}  // end class InfixApp
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值