表达式字符串转化为后缀表达式格式

原创 2012年03月29日 11:23:54
Java数据结构和算法中文第二版.pdf 代码
StackX.java
package com.ch4.infix;

public class StackX {

	private int maxSize ;
	private char[] stackArray ;
	private int top ;
	
	public StackX(int size){
		
		maxSize = size ;
		stackArray = new char[size] ;
		top = -1 ;
	}
	
	public void push(char elem){
		
		stackArray[++top] = elem ;
	}
	
	public char pop(){
		
		return stackArray[top--] ;
	}
	
	public char peek(){
		
		return stackArray[top] ;
	}
	
	public boolean isEmpty(){
		
		return (top == -1) ;
	}
	
	public char peekIndex(int index){
		
		return stackArray[index] ;
	}
	
	public int size(){
		
		return top +1 ;
	}
	public void displayStack(String info){
		
		System.out.print(info) ;
		System.out.print("Stack (bottom -->top): ") ;
		for (int j = 0; j < size(); j++){
			System.out.print(peekIndex(j)) ;
			System.out.print(' ');
		}
		System.out.println() ;
	}
}

Infix.java
package com.ch4.infix;


public class Infix {

	private StackX theStack;
	private String input;
	private String output = "";

	public Infix() {

	}

	public Infix(String in) {
		input = in;
		int stackSize = input.length();
		theStack = new StackX(stackSize);
	}

	public String doTrans() {

		for (int i = 0; i < input.length(); i++) {

			char ch = input.charAt(i);
			if (ch == ' '){
				continue ;
			}
			theStack.displayStack("For " + ch + " ");

			switch (ch) {
			case '+':
			case '-':
				gotOper(ch, 1);
				break;
			case '*':
			case '/':
				gotOper(ch, 2);
				break;
			case '(':
				theStack.push(ch);
				break;
			case ')':
				gotParent(ch);
				break;
			default:
				output += ch;
				break;
			}

		}
		while (!theStack.isEmpty()) {
			theStack.displayStack("While ");
			output += theStack.pop();
		}
		theStack.displayStack("End  ");
		return output;
	}

	public void gotOper(char opThis, int prec1) {

		while (!theStack.isEmpty()) {

			char opTop = theStack.pop();
			if (opTop == '(') {
				theStack.push(opTop);
				break;
			} else {
				int prec2 = 2;
				if (opTop == '+' || opTop == '-') {
					prec2 = 1;
				}

				if (prec2 < prec1) {
					theStack.push(opTop);
					break;
				} else {
					output += opTop;
				}
			} // end else
		} // end while

		theStack.push(opThis);
	}

	public void gotParent(char ch) {

		while (!theStack.isEmpty()) {

			char chx = theStack.pop();
			if (chx == '(') {
				break;
			} else {
				output += chx;
			}
		} // end while
	}
}

InfixApp.java

package com.ch4.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import com.ch4.infix.Infix;

public class InfixApp {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {

		String input , output ;
		
		while(true ){
			
			System.out.print("Enter infix: ") ;
			System.out.flush() ;
			input = getString() ;
			
			if (input.equals("")){
				break ;
			}
			Infix theTrans = new Infix(input) ;
			
			output = theTrans.doTrans() ;
			System.out.println("src String : " + input) ;
			System.out.println("Postfix is :" + output) ; ;
		}
	}
	
	public static String getString() throws IOException{
		
		InputStreamReader isr = new InputStreamReader(System.in) ;
		BufferedReader br = new BufferedReader(isr) ;
		String s = br.readLine() ;
		return s ;
		
	}

}

相关文章推荐

字符串转化为数学表达式并求值(后缀表达式)

主要用到后缀表达式和利用后缀表达式求值。 #include #include #include #include #include #include using namespace std; c...
  • zwfars
  • zwfars
  • 2015年11月23日 00:29
  • 270

字符串的前中后缀表达式,以及KMP算法。

本文主要涉及字符串的前中后缀表达式,以及KMP算法。 首先如我们所知道的,在C++中,一个字符串有三种表达形式。前缀、中缀和后缀形式。 区别在于:前缀表达式由操作数后面紧跟两个操作数构成的。如:*...

后缀表达式字符串计算 --只对个位数计算及 1* 2 -3+6/2

Java数据结构和算法中文第二版.pdf 代码StackX.java package com.ch4.postfix; public class StackX { private ...
  • cai5
  • cai5
  • 2012年03月29日 11:27
  • 797

后缀表达式转化及求值

#include #include #include #include #include using namespace std; #define MAXN 111 mapyxj;//优先级 char...

逆波兰计算器与中缀表达式向后缀表达式的转化实例

在本篇博文中,博主通过运用栈这一数据结构首先实现中缀表达式到后缀表达式的转换,而后通过结果运用逆波兰计算器得出计算结果。 具体代码如下: #include #include #include ...

中缀表达式转化为后缀表达式

  • 2014年06月15日 12:14
  • 1KB
  • 下载

[数据结构] 表达式求值(转化为后缀表达式再求值或直接求值)

两种情况: 1. 根据输入的算数表达式,如(56-20) /(4+2), 先转化为后缀表达式(逆波兰式)56#20#-4#2#+/  因为输入的数字有多位数的(56),所以数之间用#隔开,然后根据后...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:表达式字符串转化为后缀表达式格式
举报原因:
原因补充:

(最多只允许输入30个字)