后缀表达式转变成表达式树

后缀表达式:ab+cde+**

转换的表达式树:



转换步骤:

如果符号是操作数,那么就建立一个单节点树并将它推入栈中。

如果符号是操作符,那么就从栈中弹出两颗树 T1 和 T2 (T1 先弹出)并形成一棵新的树,该树的根就是操作符,它的左、右儿子分别是 T2 和 T1。然后将这颗新树压入栈中。


代码示例

import java.util.Stack;

/**
 * 后缀表达式转换成表达式数
 * @author GongQiang
 *
 */
public class PostExpressionToTree {

	private Stack<TreeNode> stack = new Stack<TreeNode>();
	/**
	 * @param args
	 *
	 * Date	  :2012-6-27
	 * Author :GongQiang
	 */
	public static void main(String[] args) {
		String postExpression = "ab+cde+**";
		
		PostExpressionToTree pett = new PostExpressionToTree();
		System.out.println( pett.transform( postExpression ) );
	}
	
	public String transform( String postExp ){
		for( int i=0 ; i<postExp.length() ; i++ ){
			char c = postExp.charAt(i);
			if( operandChar(c) ){
				TreeNode root = TreeNode.buildNode(c);
				TreeNode rightChild = stack.pop();
				TreeNode leftChild = stack.pop();
				root.setLeftChild( leftChild );
				root.setRightChild( rightChild );
				
				stack.push( root );
			}
			else{
				stack.push( TreeNode.buildNode(c) );
			}
		}
		
		// 打印表达式树
		StringBuilder sb = new StringBuilder();
		printTree( sb, stack.pop() );
		return sb.toString();
	}
	
	/**
	 * 中序遍历打印
	 * @param node
	 * @return
	 *
	 * Date	  :2012-6-27
	 * Author :GongQiang
	 */
	private void printTree( StringBuilder sb,TreeNode node ){
		if( node.leftChild != null ){
			printTree( sb, node.leftChild );
		}
		sb.append( node.c );
		
		if( node.rightChild != null ){
			printTree( sb, node.rightChild );
		}
	}
	
	/**
	 * 是操作符 ?
	 * @return
	 *
	 * Date	  :2012-6-26
	 * Author :GongQiang
	 */
	private boolean operandChar( char c ){
		char[] operands = { '+', '*', '(', ')' };
		for( char op : operands ){
			if( c == op ){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 构造数的节点类
	 * @author GongQiang
	 *
	 */
	static class TreeNode{
		char c;
		TreeNode leftChild;
		TreeNode rightChild;
		
		public TreeNode getLeftChild() {
			return leftChild;
		}

		public void setLeftChild(TreeNode leftChild) {
			this.leftChild = leftChild;
		}

		public TreeNode getRightChild() {
			return rightChild;
		}

		public void setRightChild(TreeNode rightChild) {
			this.rightChild = rightChild;
		}

		private TreeNode(char c, TreeNode leftChild, TreeNode rightChild) {
			super();
			this.c = c;
			this.leftChild = leftChild;
			this.rightChild = rightChild;
		}

		static TreeNode buildNode( char c ){
			return new TreeNode( c, null, null );
		}
		
		static TreeNode buildNode( char c, TreeNode leftChild, TreeNode rightChild ){
			return new TreeNode( c, leftChild, rightChild );
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值