stringcharacterconstructornullclasslist
[java] view plaincopy
package Test;
import java.util.Stack;
public class Expression
{
public Expression(String src)
{
// TODO Auto-generated constructor stub
this.src = src;
des = new char[MAX_LENGTH];
}
//将输入的中缀表达式转换成后缀表达式
public int getRank(char c)
{
switch (c)
{
case '!':
return 3;
case '*':
return 2;
case '+':
return 2;
case '(':
return 1;
case ')':
return 1;
default:
return -1;
}
}
public void translate()
{
Stack<Character> set = new Stack<Character>();//运算的集合
Stack<Character> opr = new Stack<Character>();//运算的操作符
int count = 0;
for(int i=0;i <src.length();i++)
{
if(src.charAt(i) <=90 && src.charAt(i)>= 65) //是大写字母的时候
{
des[count++] = src.charAt(i);
}
else if(src.charAt(i) == '(')//是左括号
{
opr.push('(');
}
else if(src.charAt(i) == ')')//是右括号
{
while(opr.peek() != '(')
{
des[count++]= opr.pop();
}
opr.pop();
}
else //是 + * !时//是普通操作符号的时候
{
if(opr.empty())
{
opr.push(src.charAt(i));
}
else
{
if( getRank(src.charAt(i)) >getRank(opr.peek()))
{
opr.push(src.charAt(i));
}
else
{
while(!opr.empty())
{
des[count++]= opr.pop();
}
opr.push(src.charAt(i));
}
}
}
}
while(!opr.empty())
{
des[count++]= opr.pop();
}
}
public String getDes()
{
String sum = new String();
for(int i=0;(this.des[i] <=90 && this.des[i] >=65) ||this.des[i] == '!' ||this.des[i] == '*' ||this.des[i] == '+';i++)
sum += new Character(this.des[i]).toString();
return sum;
}
public String getSrc()
{
return this.src;
}
public void print()
{
System.out.println("SRC : "+src);
System.out.println("DES : "+new String(des));
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Expression testExpression = new Expression("!P*!Q+(R*Z)+G*(L+Y)");
testExpression.translate();
testExpression.print();
}
private String src;
private char[] des;
private final static int MAX_LENGTH = 256;
}
[java] view plaincopy
package Test;
import java.awt.List;
import java.awt.Point;
import java.awt.RadialGradientPaint;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import javax.swing.plaf.basic.BasicTextAreaUI;
import javax.xml.crypto.Data;
public class BTree
{
public BTree()
{
root = new TreeNode();
}
//前序遍历
public void printBTree()
{
this.frontOrder(this.root);
}
public void frontOrder(TreeNode localNode)
{
if(localNode != null) {
//访问根节点
localNode.printNode();
//前序遍历左子树
frontOrder(localNode.lchild);
//前序遍历右子树
frontOrder(localNode.rchild);
}
}
//层序遍历
public void levelOrder()
{
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(root);
list.add(root);
while(q.size() !=0)
{
q.peek().printNode();
if(q.peek().lchild !=null)
{
q.offer(q.peek().lchild);
list.add(q.peek().lchild);
}
if(q.peek().rchild !=null)
{
q.offer(q.peek().rchild);
list.add(q.peek().rchild);
}
q.poll();
}
}
public static boolean IsOperater(char c)
{
if(c == '+'||c == '*')
return true;
return false;
}
public static boolean InsertAble(TreeNode Node)
{
if(Node.lchild == null || Node.rchild ==null)
return true;
return false;
}
//前序遍历找到需要插入的节点
public TreeNode findBTree()
{
findfrontOrder(root);
TreeNode tempNode = new TreeNode();
while(!stack.isEmpty())
{
tempNode = stack.pop();
if(InsertAble(tempNode))
{
stack.clear();
return tempNode ;
}
}
return tempNode;
}
public static void findfrontOrder(TreeNode localNode)
{
if(localNode !=null && IsOperater(localNode.data.charAt(0)))
{
//访问根节点
stack.push(localNode);
//前序遍历左子树
findfrontOrder(localNode.lchild);
//前序遍历右子树
findfrontOrder(localNode.rchild);
}
}
//反转字符串
public static String reverse(String src)
{
String des = new String();
for(int i=src.length()-1;i>=0;i--)
des+=src.charAt(i);
return des;
}
//给你个Node节点增加子节点
public void addChild(TreeNode Node,char c)
{
if(Node.lchild == null)
{
Node.lchild = new TreeNode(new Character(c).toString());
}
else
{
Node.rchild = new TreeNode(new Character(c).toString());
}
}
public void addChild(TreeNode Node,TreeNode Child)
{
if(Node.lchild == null)
{
Node.lchild = Child;
}
else
{
Node.rchild = Child;
}
}
//给TreeNode 节点设置point
public static void setNodePoint(TreeNode Node,Point p)
{
Node.setPoint(p);
}
//根据expression建立一棵树
public void createTree()
{
root.setData(new Character(this.expression.charAt(0)).toString());
TreeNode temNode = new TreeNode();
for(int i=1;i<expression.length();i++)
{
if(expression.charAt(i) != '!')
{
temNode = this.findBTree();
this.addChild(temNode, expression.charAt(i));
}
else
{
TreeNode temNode1 = new TreeNode(new Character(expression.charAt(i)).toString());
TreeNode temNode2 = new TreeNode(new Character(expression.charAt(++i)).toString());
temNode1.lchild = temNode2;
temNode = this.findBTree();
this.addChild(temNode, temNode1);
}
}
//测试树是否建立正确
/*
System.out.println("***************");
this.levelOrder();
System.out.println("***************");
*/
}
public void setExpression(String src)
{
this.expression = new String(src);
}
/**
* @param args
*/
public static void main(String[] args)
{
BTree tesTree = new BTree();
tesTree.setExpression(reverse("P!Q!*RZ*+G+LY+*"));
tesTree.createTree();
tesTree.levelOrder();
}
class TreeNode
{
//node initialize
TreeNode()
{
this.data = null;
this.lchild = this.rchild = null;
}
public TreeNode(String value)
{
this();
this.setData(value);
}
//set Data
private void setData(String value)
{
this.data = value;
}
//set Point
@SuppressWarnings("unused")
public void setPoint(Point p)
{
this.point = new Point(p);
}
public boolean hasPoint()
{
return !(null==this.point);
}
public Point getPoint()
{
return this.point;
}
@SuppressWarnings("unused")
private boolean isLChildNull()
{
return this.lchild == null;
}
@SuppressWarnings("unused")
private boolean isRChildNull()
{
return this.rchild == null;
}
private void printNode()
{
//if(this.data != null)
System.out.println("Node Data is : "+ this.data);
}
public TreeNode lchild;
public TreeNode rchild;
public String data;
public Point point;
}
private static TreeNode root;
private static Stack<TreeNode> stack = new Stack<BTree.TreeNode>();
private String expression;
public ArrayList<TreeNode> list = new ArrayList<BTree.TreeNode>();
}
[java] view plaincopy
package Test;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;
import org.omg.CORBA.PUBLIC_MEMBER;
import Test.BTree.TreeNode;
public class MyFrame extends Frame
{
public MyFrame() throws HeadlessException
{
// TODO Auto-generated constructor stub
setSize(800, 600);
setLocation(new Point(200, 200));
setBackground(new Color(100, 230, 20));
setResizable(false);
setVisible(true);
setTitle("BTree And Expression");
//将 X与fame 关闭关联
addWindowListener(new WindowListener() {
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
});
}
public MyFrame(GraphicsConfiguration gc) {
super(gc);
// TODO Auto-generated constructor stub
}
public MyFrame(String title) throws HeadlessException {
super(title);
// TODO Auto-generated constructor stub
}
public MyFrame(String title, GraphicsConfiguration gc) {
super(title, gc);
// TODO Auto-generated constructor stub
}
@Override
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.red);
g.setFont(new Font("Serif",Font.BOLD|Font.ITALIC,24));
g.setColor(Color.white);
g.drawString("公式: "+this.expressionString, 50, 480);
g.drawString("\'*\' = 交集,\'+\' = 并集,\'!\' = 非",50,510);
g.setColor(Color.red);
this.R = 30;
Point startPoint = new Point(this.getWidth()/2,100);
TreeNode tempNode;
TreeNode tempNode2 = null;
this.list.get(0).setPoint(startPoint);
for(int i=0;i<this.list.size();i++,xoffset-=8)
{
tempNode = this.list.get(i);
if(tempNode.hasPoint())
{
g.fillOval(tempNode.getPoint().x-R, tempNode.getPoint().y-R, R, R);
g.setColor(Color.white);
g.drawString(tempNode.data,tempNode.getPoint().x-R/2,tempNode.getPoint().y-R/2);
g.setColor(Color.red);
}
else
{
for( int j=0;j<i;j++)
{
tempNode2 = this.list.get(j);
if(tempNode2.lchild == tempNode || tempNode2.rchild == tempNode)
{
if( tempNode2.lchild == tempNode )
{
tempNode.setPoint(new Point(tempNode2.getPoint().x - xoffset,tempNode2.getPoint().y+yoffset));
j = i;
}
else
{
tempNode.setPoint(new Point(tempNode2.getPoint().x + xoffset,tempNode2.getPoint().y+yoffset));
j = i;
}
}
}
g.setColor(Color.red);
g.drawLine(tempNode2.getPoint().x-R/2, tempNode2.getPoint().y-R, tempNode.getPoint().x, tempNode.getPoint().y-3*R/4);
g.fillOval(tempNode.getPoint().x-R, tempNode.getPoint().y-R, R, R);
g.setColor(Color.white);
g.drawString(tempNode.data,tempNode.getPoint().x-2*R/3,tempNode.getPoint().y-R/3);
g.setColor(Color.red);
}
}
}
//反转字符串
public static String reverse(String src)
{
String sumString = new String();
for(int i=src.length()-1 ;i>=0;i--)
sumString += new Character(src.charAt(i)).toString();
return sumString;
}
public void setEX(String src)
{
// src = "!P*!Q+(R*Z)+G*(L+Y)"
Expression expression = new Expression(src);
expression.translate();
System.out.println("DES : " + expression.getDes());
System.out.println("DES lengeh " + +expression.getDes().length());
BTree tesTree = new BTree();
tesTree.setExpression(reverse(expression.getDes()));
tesTree.createTree();
tesTree.levelOrder(); //层序遍历打印结果
for(int i=0; i<tesTree.list.size();i++)
{
this.list.add(tesTree.list.get(i));
}
this.expressionString = expression.getSrc();
//System.out.println(tesTree.list.toString()); list中存放的是存放的是层序的节点
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
//输入中缀表达式
MyFrame frame = new MyFrame();
frame.setEX("!P*!Q+(R*Z)+G*(L+Y)");
}
private int R;
private Color color;//节点颜色
private int xoffset = 150;
private int yoffset = 60;
public ArrayList<TreeNode> list = new ArrayList<BTree.TreeNode>();
public String expressionString;
}
[java] view plaincopy
package Test;
import java.util.Stack;
public class Expression
{
public Expression(String src)
{
// TODO Auto-generated constructor stub
this.src = src;
des = new char[MAX_LENGTH];
}
//将输入的中缀表达式转换成后缀表达式
public int getRank(char c)
{
switch (c)
{
case '!':
return 3;
case '*':
return 2;
case '+':
return 2;
case '(':
return 1;
case ')':
return 1;
default:
return -1;
}
}
public void translate()
{
Stack<Character> set = new Stack<Character>();//运算的集合
Stack<Character> opr = new Stack<Character>();//运算的操作符
int count = 0;
for(int i=0;i <src.length();i++)
{
if(src.charAt(i) <=90 && src.charAt(i)>= 65) //是大写字母的时候
{
des[count++] = src.charAt(i);
}
else if(src.charAt(i) == '(')//是左括号
{
opr.push('(');
}
else if(src.charAt(i) == ')')//是右括号
{
while(opr.peek() != '(')
{
des[count++]= opr.pop();
}
opr.pop();
}
else //是 + * !时//是普通操作符号的时候
{
if(opr.empty())
{
opr.push(src.charAt(i));
}
else
{
if( getRank(src.charAt(i)) >getRank(opr.peek()))
{
opr.push(src.charAt(i));
}
else
{
while(!opr.empty())
{
des[count++]= opr.pop();
}
opr.push(src.charAt(i));
}
}
}
}
while(!opr.empty())
{
des[count++]= opr.pop();
}
}
public String getDes()
{
String sum = new String();
for(int i=0;(this.des[i] <=90 && this.des[i] >=65) ||this.des[i] == '!' ||this.des[i] == '*' ||this.des[i] == '+';i++)
sum += new Character(this.des[i]).toString();
return sum;
}
public String getSrc()
{
return this.src;
}
public void print()
{
System.out.println("SRC : "+src);
System.out.println("DES : "+new String(des));
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Expression testExpression = new Expression("!P*!Q+(R*Z)+G*(L+Y)");
testExpression.translate();
testExpression.print();
}
private String src;
private char[] des;
private final static int MAX_LENGTH = 256;
}
[java] view plaincopy
package Test;
import java.awt.List;
import java.awt.Point;
import java.awt.RadialGradientPaint;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import javax.swing.plaf.basic.BasicTextAreaUI;
import javax.xml.crypto.Data;
public class BTree
{
public BTree()
{
root = new TreeNode();
}
//前序遍历
public void printBTree()
{
this.frontOrder(this.root);
}
public void frontOrder(TreeNode localNode)
{
if(localNode != null) {
//访问根节点
localNode.printNode();
//前序遍历左子树
frontOrder(localNode.lchild);
//前序遍历右子树
frontOrder(localNode.rchild);
}
}
//层序遍历
public void levelOrder()
{
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(root);
list.add(root);
while(q.size() !=0)
{
q.peek().printNode();
if(q.peek().lchild !=null)
{
q.offer(q.peek().lchild);
list.add(q.peek().lchild);
}
if(q.peek().rchild !=null)
{
q.offer(q.peek().rchild);
list.add(q.peek().rchild);
}
q.poll();
}
}
public static boolean IsOperater(char c)
{
if(c == '+'||c == '*')
return true;
return false;
}
public static boolean InsertAble(TreeNode Node)
{
if(Node.lchild == null || Node.rchild ==null)
return true;
return false;
}
//前序遍历找到需要插入的节点
public TreeNode findBTree()
{
findfrontOrder(root);
TreeNode tempNode = new TreeNode();
while(!stack.isEmpty())
{
tempNode = stack.pop();
if(InsertAble(tempNode))
{
stack.clear();
return tempNode ;
}
}
return tempNode;
}
public static void findfrontOrder(TreeNode localNode)
{
if(localNode !=null && IsOperater(localNode.data.charAt(0)))
{
//访问根节点
stack.push(localNode);
//前序遍历左子树
findfrontOrder(localNode.lchild);
//前序遍历右子树
findfrontOrder(localNode.rchild);
}
}
//反转字符串
public static String reverse(String src)
{
String des = new String();
for(int i=src.length()-1;i>=0;i--)
des+=src.charAt(i);
return des;
}
//给你个Node节点增加子节点
public void addChild(TreeNode Node,char c)
{
if(Node.lchild == null)
{
Node.lchild = new TreeNode(new Character(c).toString());
}
else
{
Node.rchild = new TreeNode(new Character(c).toString());
}
}
public void addChild(TreeNode Node,TreeNode Child)
{
if(Node.lchild == null)
{
Node.lchild = Child;
}
else
{
Node.rchild = Child;
}
}
//给TreeNode 节点设置point
public static void setNodePoint(TreeNode Node,Point p)
{
Node.setPoint(p);
}
//根据expression建立一棵树
public void createTree()
{
root.setData(new Character(this.expression.charAt(0)).toString());
TreeNode temNode = new TreeNode();
for(int i=1;i<expression.length();i++)
{
if(expression.charAt(i) != '!')
{
temNode = this.findBTree();
this.addChild(temNode, expression.charAt(i));
}
else
{
TreeNode temNode1 = new TreeNode(new Character(expression.charAt(i)).toString());
TreeNode temNode2 = new TreeNode(new Character(expression.charAt(++i)).toString());
temNode1.lchild = temNode2;
temNode = this.findBTree();
this.addChild(temNode, temNode1);
}
}
//测试树是否建立正确
/*
System.out.println("***************");
this.levelOrder();
System.out.println("***************");
*/
}
public void setExpression(String src)
{
this.expression = new String(src);
}
/**
* @param args
*/
public static void main(String[] args)
{
BTree tesTree = new BTree();
tesTree.setExpression(reverse("P!Q!*RZ*+G+LY+*"));
tesTree.createTree();
tesTree.levelOrder();
}
class TreeNode
{
//node initialize
TreeNode()
{
this.data = null;
this.lchild = this.rchild = null;
}
public TreeNode(String value)
{
this();
this.setData(value);
}
//set Data
private void setData(String value)
{
this.data = value;
}
//set Point
@SuppressWarnings("unused")
public void setPoint(Point p)
{
this.point = new Point(p);
}
public boolean hasPoint()
{
return !(null==this.point);
}
public Point getPoint()
{
return this.point;
}
@SuppressWarnings("unused")
private boolean isLChildNull()
{
return this.lchild == null;
}
@SuppressWarnings("unused")
private boolean isRChildNull()
{
return this.rchild == null;
}
private void printNode()
{
//if(this.data != null)
System.out.println("Node Data is : "+ this.data);
}
public TreeNode lchild;
public TreeNode rchild;
public String data;
public Point point;
}
private static TreeNode root;
private static Stack<TreeNode> stack = new Stack<BTree.TreeNode>();
private String expression;
public ArrayList<TreeNode> list = new ArrayList<BTree.TreeNode>();
}
[java] view plaincopy
package Test;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;
import org.omg.CORBA.PUBLIC_MEMBER;
import Test.BTree.TreeNode;
public class MyFrame extends Frame
{
public MyFrame() throws HeadlessException
{
// TODO Auto-generated constructor stub
setSize(800, 600);
setLocation(new Point(200, 200));
setBackground(new Color(100, 230, 20));
setResizable(false);
setVisible(true);
setTitle("BTree And Expression");
//将 X与fame 关闭关联
addWindowListener(new WindowListener() {
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
});
}
public MyFrame(GraphicsConfiguration gc) {
super(gc);
// TODO Auto-generated constructor stub
}
public MyFrame(String title) throws HeadlessException {
super(title);
// TODO Auto-generated constructor stub
}
public MyFrame(String title, GraphicsConfiguration gc) {
super(title, gc);
// TODO Auto-generated constructor stub
}
@Override
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.red);
g.setFont(new Font("Serif",Font.BOLD|Font.ITALIC,24));
g.setColor(Color.white);
g.drawString("公式: "+this.expressionString, 50, 480);
g.drawString("\'*\' = 交集,\'+\' = 并集,\'!\' = 非",50,510);
g.setColor(Color.red);
this.R = 30;
Point startPoint = new Point(this.getWidth()/2,100);
TreeNode tempNode;
TreeNode tempNode2 = null;
this.list.get(0).setPoint(startPoint);
for(int i=0;i<this.list.size();i++,xoffset-=8)
{
tempNode = this.list.get(i);
if(tempNode.hasPoint())
{
g.fillOval(tempNode.getPoint().x-R, tempNode.getPoint().y-R, R, R);
g.setColor(Color.white);
g.drawString(tempNode.data,tempNode.getPoint().x-R/2,tempNode.getPoint().y-R/2);
g.setColor(Color.red);
}
else
{
for( int j=0;j<i;j++)
{
tempNode2 = this.list.get(j);
if(tempNode2.lchild == tempNode || tempNode2.rchild == tempNode)
{
if( tempNode2.lchild == tempNode )
{
tempNode.setPoint(new Point(tempNode2.getPoint().x - xoffset,tempNode2.getPoint().y+yoffset));
j = i;
}
else
{
tempNode.setPoint(new Point(tempNode2.getPoint().x + xoffset,tempNode2.getPoint().y+yoffset));
j = i;
}
}
}
g.setColor(Color.red);
g.drawLine(tempNode2.getPoint().x-R/2, tempNode2.getPoint().y-R, tempNode.getPoint().x, tempNode.getPoint().y-3*R/4);
g.fillOval(tempNode.getPoint().x-R, tempNode.getPoint().y-R, R, R);
g.setColor(Color.white);
g.drawString(tempNode.data,tempNode.getPoint().x-2*R/3,tempNode.getPoint().y-R/3);
g.setColor(Color.red);
}
}
}
//反转字符串
public static String reverse(String src)
{
String sumString = new String();
for(int i=src.length()-1 ;i>=0;i--)
sumString += new Character(src.charAt(i)).toString();
return sumString;
}
public void setEX(String src)
{
// src = "!P*!Q+(R*Z)+G*(L+Y)"
Expression expression = new Expression(src);
expression.translate();
System.out.println("DES : " + expression.getDes());
System.out.println("DES lengeh " + +expression.getDes().length());
BTree tesTree = new BTree();
tesTree.setExpression(reverse(expression.getDes()));
tesTree.createTree();
tesTree.levelOrder(); //层序遍历打印结果
for(int i=0; i<tesTree.list.size();i++)
{
this.list.add(tesTree.list.get(i));
}
this.expressionString = expression.getSrc();
//System.out.println(tesTree.list.toString()); list中存放的是存放的是层序的节点
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
//输入中缀表达式
MyFrame frame = new MyFrame();
frame.setEX("!P*!Q+(R*Z)+G*(L+Y)");
}
private int R;
private Color color;//节点颜色
private int xoffset = 150;
private int yoffset = 60;
public ArrayList<TreeNode> list = new ArrayList<BTree.TreeNode>();
public String expressionString;
}