您的位置:首页 > 其它

深圳同城快跑笔试题目 3 实现四则运算

2015-05-18 17:18 330 查看
package com.cici.深圳同城快跑;

import java.util.Stack;

class Node
{
public char cData;              // data item (key)
public Node leftChild;         // this node's left child
public Node rightChild;        // this node's right child

public void displayNode()      // display ourself
{
System.out.print('{');
System.out.print(cData);
System.out.print("} ");
}
}  // end class Node
class Tree
{
public Node root;             // first node of tree
public int size;
//-------------------------------------------------------------
public Tree()                  // constructor
{ root = null; }            // no nodes in tree yet
//-------------------------------------------------------------
public Node find(char key)      // find node with given key
{                           // (assumes non-empty tree)
Node current = root;               // start at root
while(current.cData != key)        // while no match,
{
if(key < current.cData)         // go left?
current = current.leftChild;
else                            // or go right?
current = current.rightChild;
if(current == null)             // if no child,
return null;                 // didn't find it
}
return current;                    // found it
}  // end find()
//-------------------------------------------------------------
public void insert(char c)
{
Node newNode = new Node();    // make new node
newNode.cData = c;           // insert data
if(root==null)                // no node in root
root = newNode;
else                          // root occupied
{
//make a new node which is stands for the new node
Node current = root;       // start at root
Node parent;
while(true)                // (exits internally)
{
//parent node is the root node
parent = current;
//go left ?
if(check(c)){
current = current.leftChild;
if(current == null)  // if end of the line,
{                 // insert on left
parent.leftChild = newNode;
return;
}
} // end if go left
else                    // or go right?
{
current = current.leftChild;
if(current == null)  // if end of the line
{                 // insert on right
parent.rightChild = newNode;
return;
}
}  // end else go right
}  // end while
}  // end else not root
}  // end insert()
//-------------------------------------------------------------
public boolean delete(char key) // delete node with given key
{                           // (assumes non-empty list)
Node current = root;
Node parent = root;
boolean isLeftChild = true;

while(current.cData != key)        // search for node
{
parent = current;
if(key < current.cData)         // go left?
{
isLeftChild = true;
current = current.leftChild;
}
else                            // or go right?
{
isLeftChild = false;
current = current.rightChild;
}
if(current == null)             // end of the line,
return false;                // didn't find it
}  // end while
// found node to delete

// if no children, simply delete it
if(current.leftChild==null &&
current.rightChild==null)
{
if(current == root)             // if root,
root = null;                 // tree is empty
else if(isLeftChild)
parent.leftChild = null;     // disconnect
else                            // from parent
parent.rightChild = null;
}

// if no right child, replace with left subtree
else if(current.rightChild==null)
if(current == root)
root = current.leftChild;
else if(isLeftChild)
parent.leftChild = current.leftChild;
else
parent.rightChild = current.leftChild;

// if no left child, replace with right subtree
else if(current.leftChild==null)
if(current == root)
root = current.rightChild;
else if(isLeftChild)
parent.leftChild = current.rightChild;
else
parent.rightChild = current.rightChild;

else  // two children, so replace with inorder successor
{
// get successor of node to delete (current)
Node successor = getSuccessor(current);

// connect parent of current to successor instead
if(current == root)
root = successor;
else if(isLeftChild)
parent.leftChild = successor;
else
parent.rightChild = successor;

// connect successor to current's left child
successor.leftChild = current.leftChild;
}  // end else two children
// (successor cannot have a left child)
return true;                                // success
}  // end delete()
//-------------------------------------------------------------
// returns node with next-highest value after delNode
// goes to right child, then right child's left descendents
private Node getSuccessor(Node delNode)
{
Node successorParent = delNode;
Node successor = delNode;
Node current = delNode.rightChild;   // go to right child
while(current != null)               // until no more
{                                 // left children,
successorParent = successor;
successor = current;
current = current.leftChild;      // go to left child
}
// if successor not
if(successor != delNode.rightChild)  // right child,
{                                 // make connections
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
return successor;
}
//-------------------------------------------------------------
public void traverse(int traverseType)
{
switch(traverseType)
{
case 1: System.out.print("\nPreorder traversal: ");
preOrder(root);
break;
case 2: System.out.print("\nInorder traversal:  ");
inOrder(root);
break;
case 3: System.out.print("\nPostorder traversal: ");
postOrder(root);
break;
}
System.out.println();
}
//-------------------------------------------------------------
public void preOrder(Node localRoot)
{
if(localRoot != null)
{
preOrder(localRoot.leftChild);
System.out.print(localRoot.cData + " ");
preOrder(localRoot.rightChild);
}
}
//-------------------------------------------------------------
public Node inOrder(Node localRoot)
{
if(localRoot != null)
{
inOrder(localRoot.leftChild);
System.out.print(localRoot.cData + " ");
inOrder(localRoot.rightChild);
}
return localRoot;
}
//-------------------------------------------------------------
public void postOrder(Node localRoot)
{
if(localRoot != null)
{
postOrder(localRoot.leftChild);
postOrder(localRoot.rightChild);
System.out.print(localRoot.cData + " ");
}
}
//check the whether a node is a signal
public static boolean check(Character ch){
if(ch.equals(new Character('+')) || ch.equals(new Character('-'))
|| ch.equals(new Character('*'))
|| ch.equals(new Character('\\') )
|| ch.equals(new Character('^'))        )
{
return true;
}
return false;
}
public long calculate( ){
long result = 0;
result+=this.root.cData-48;
Node localRoot= root.leftChild;
while(localRoot!=null){
if(localRoot.cData=='+'){
if(localRoot.rightChild!=null){
result+=localRoot.rightChild.cData-48;
}
}
if(localRoot.cData=='-'){
if(localRoot.rightChild!=null){
result-=localRoot.rightChild.cData-48;
}
}
if(localRoot.cData=='/'){
if(localRoot.rightChild!=null){
result/=localRoot.rightChild.cData-48;
}
}
if(localRoot.cData=='*'){
if(localRoot.rightChild!=null){
result*=localRoot.rightChild.cData-48;
}
}

/*int m = 4;
int n = 2;
int result = 1;
for(int i=0;i<n;i++){
result*=m;
}
System.out.println(result);*/

if(localRoot.cData=='^'){
long temp = 1;
for(int i=0;i<localRoot.rightChild.cData-48;i++){
temp*=result;
}
result= temp;
}
localRoot= localRoot.leftChild;
}
return result;
}
//-------------------------------------------------------------
public void displayTree()
{
Stack globalStack = new Stack();
globalStack.push(root);
int nBlanks = 32;
boolean isRowEmpty = false;
System.out.println(
"......................................................");
while(isRowEmpty==false)
{
Stack localStack = new Stack();
isRowEmpty = true;
for(int j=0; j<nBlanks; j++)
System.out.print(' ');
while(globalStack.isEmpty()==false)
{
Node temp = (Node)globalStack.pop();
if(temp != null)
{
System.out.print(temp.cData);
localStack.push(temp.leftChild);
localStack.push(temp.rightChild);
if(temp.leftChild != null ||
temp.rightChild != null)
isRowEmpty = false;
}
else
{
System.out.print("--");
localStack.push(null);
localStack.push(null);
}
for(int j=0; j<nBlanks*2-2; j++)
System.out.print(' ');
}  // end while globalStack not empty
System.out.println();
nBlanks /= 2;
while(localStack.isEmpty()==false)
globalStack.push( localStack.pop() );
}  // end while isRowEmpty is false
System.out.println(
"......................................................");
}  // end displayTree()
//-------------------------------------------------------------
}  // end class Tree
public class TreeApp{
public static void main(String[] args) {
Tree tree = new Tree();
tree.insert('2');
tree.insert('^');
tree.insert('3');
tree.insert('+');
tree.insert('1');
tree.insert('*');
tree.insert('2');
tree.displayTree();
long result = tree.calculate();
System.out.println("----"+result+"----");
}
}


以上代码没有考虑优先级别顺序 以下代码考虑四则运算符号有限级别 先* / ^ 再 + -

但是没有输出正确答案.因为calculate()方法还是有误.以此本人得到的结论利用节点树形结构太复杂了.尽量避免.本人有空闲时间会参考jdk的tree.

不过依然太难了.调试很多次都没有输出正确结果.今天打算放弃了.有会修改程序的高手希望您看到了改一下.我实在不想改了.

package com.cici.深圳同城快跑;

import java.util.Stack;

class Node
{
public char cData;              // data item (key)
public Node leftChild;         // this node's left child
public Node rightChild;        // this node's right child

public  Node(char cData){
this.cData = cData;
}

public void displayNode()      // display ourself
{
System.out.print('{');
System.out.print(cData);
System.out.print("} ");
}
}  // end class Node
class Tree
{
public Node root;             // first node of tree
public int size;
//-------------------------------------------------------------
public Tree()                  // constructor
{ root = null; }            // no nodes in tree yet
//-------------------------------------------------------------
public Node find(char key)      // find node with given key
{                           // (assumes non-empty tree)
Node current = root;               // start at root
while(current.cData != key)        // while no match,
{
if(key < current.cData)         // go left?
current = current.leftChild;
else                            // or go right?
current = current.rightChild;
if(current == null)             // if no child,
return null;                 // didn't find it
}
return current;                    // found it
}  // end find()
//-------------------------------------------------------------
public void insert(char c)
{
Node newNode = new Node(c);    // make new node
if(root==null&&!check(c)){
root = new Node(' ');
root.rightChild=newNode;
size++;
return;
}                // no node in root
else if(root!=null&!check(root.cData)){
Node temp = root.rightChild;
root=new Node(c);
root.rightChild=temp;
size++;
return;
}
else                          // root occupied
{
//make a new node which is stands for the new node
Node current = root;       // start at root
Node parent;
while(true)                // (exits internally)
{
//parent node is the root node
parent = current;
//go left ?
if(check(c)){
current = current.leftChild;
if(current.cData == ' ')  // if end of the line,
{                 // insert on left
newNode=new Node(c);
newNode.rightChild=current.rightChild;
parent.leftChild = newNode;
size++;
return;
}
else continue;
} // end if go left
else                    // or go right?
{
current = current.leftChild;
if(current == null)  // if end of the line
{                 // insert on right
newNode = new Node(' ');    // make new node
newNode.rightChild=new Node(c);

parent.leftChild = newNode;
size++;
return;
}
}  // end else go right
}  // end while
}  // end else not root
}  // end insert()
//-------------------------------------------------------------
public boolean delete(char key) // delete node with given key
{                           // (assumes non-empty list)
Node current = root;
Node parent = root;
boolean isLeftChild = true;
while(current.cData != key)        // search for node
{
parent = current;
if(key < current.cData)         // go left?
{
isLeftChild = true;
current = current.leftChild;
}
else                            // or go right?
{
isLeftChild = false;
current = current.rightChild;
}
if(current == null)             // end of the line,
return false;                // didn't find it
}  // end while
// found node to delete

// if no children, simply delete it
if(current.leftChild==null &&
current.rightChild==null)
{
if(current == root)             // if root,
root = null;                 // tree is empty
else if(isLeftChild)
parent.leftChild = null;     // disconnect
else                            // from parent
parent.rightChild = null;
}

// if no right child, replace with left subtree
else if(current.rightChild==null)
if(current == root)
root = current.leftChild;
else if(isLeftChild)
parent.leftChild = current.leftChild;
else
parent.rightChild = current.leftChild;

// if no left child, replace with right subtree
else if(current.leftChild==null)
if(current == root)
root = current.rightChild;
else if(isLeftChild)
parent.leftChild = current.rightChild;
else
parent.rightChild = current.rightChild;

else  // two children, so replace with inorder successor
{
// get successor of node to delete (current)
Node successor = getSuccessor(current);

// connect parent of current to successor instead
if(current == root)
root = successor;
else if(isLeftChild)
parent.leftChild = successor;
else
parent.rightChild = successor;

// connect successor to current's left child
successor.leftChild = current.leftChild;
}  // end else two children
// (successor cannot have a left child)
return true;                                // success
}  // end delete()
//-------------------------------------------------------------
// returns node with next-highest value after delNode
// goes to right child, then right child's left descendents
private Node getSuccessor(Node delNode)
{
Node successorParent = delNode;
Node successor = delNode;
Node current = delNode.rightChild;   // go to right child
while(current != null)               // until no more
{                                 // left children,
successorParent = successor;
successor = current;
current = current.leftChild;      // go to left child
}
// if successor not
if(successor != delNode.rightChild)  // right child,
{                                 // make connections
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
return successor;
}
//-------------------------------------------------------------
public void traverse(int traverseType)
{
switch(traverseType)
{
case 1: System.out.print("\nPreorder traversal: ");
preOrder(root);
break;
case 2: System.out.print("\nInorder traversal:  ");
inOrder(root);
break;
case 3: System.out.print("\nPostorder traversal: ");
postOrder(root);
break;
}
System.out.println();
}
//-------------------------------------------------------------
public void preOrder(Node localRoot)
{
if(localRoot != null)
{
preOrder(localRoot.leftChild);
System.out.print(localRoot.cData + " ");
preOrder(localRoot.rightChild);
}
}
//-------------------------------------------------------------
public Node inOrder(Node localRoot)
{
if(localRoot != null)
{
inOrder(localRoot.leftChild);
System.out.print(localRoot.cData + " ");
inOrder(localRoot.rightChild);
}
return localRoot;
}
//-------------------------------------------------------------
public void postOrder(Node localRoot)
{
if(localRoot != null)
{
postOrder(localRoot.leftChild);
postOrder(localRoot.rightChild);
System.out.print(localRoot.cData + " ");
}
}
//check the whether a node is a signal
public static boolean check(Character ch){
if(ch.equals(new Character('+')) || ch.equals(new Character('-'))
|| ch.equals(new Character('*'))
|| ch.equals(new Character('/') )
|| ch.equals(new Character('^'))        )
{
return true;
}
return false;
}
public long calculate(){
Node current = this.root;
Node parent  = this.root;
long result = 0;
//handle * / ^
while(current.cData!=' '){
int item1 = current.rightChild.cData-48;
int item2 = current.leftChild.rightChild.cData-48;
long temp = 1;
if(current!=null && current.cData=='*'){
result =item1*item2;
Node next = current.leftChild;
next.rightChild=new Node(((char) (result+48)));
//    parent.cData=next.cData;
parent.leftChild = next;
current = next;
continue;
}if(current!=null && current.cData=='/'){
result =item1/item2;
Node next = current.leftChild;
next.rightChild=new Node(((char) (result+48)));
//    parent.cData=next.cData;
parent.leftChild = next;
current = next;
continue;
}if(current!=null && current.cData=='^'){
for(int i=0;i<item2;i++){
temp*=result;
}
result = temp;
Node next = current.leftChild;
next.rightChild=new Node(((char) (result+48)));
//    parent.cData=next.cData;
parent.leftChild = next;
current = next;
continue;
}
parent=current;
current = current.leftChild;
}
//handle + -
//parent = root;
root.leftChild =parent;
parent = root;
current = root;

while(current.leftChild!=null ){
result = 0;
int item1 = parent.rightChild.cData-48;
int item2 = parent.leftChild.rightChild.cData-48;
//long temp = 1;
if(parent.cData=='+'){
result +=item1+item2;
}if(parent.cData=='-'){
result +=item1-item2;
}
current = current.leftChild;
parent=current;
}
return result;
}
//-------------------------------------------------------------
public void displayTree()
{
Stack globalStack = new Stack();
globalStack.push(root);
int nBlanks = 32;
boolean isRowEmpty = false;
System.out.println(
"......................................................");
while(isRowEmpty==false)
{
Stack localStack = new Stack();
isRowEmpty = true;
for(int j=0; j<nBlanks; j++)
System.out.print(' ');
while(globalStack.isEmpty()==false)
{
Node temp = (Node)globalStack.pop();
if(temp != null)
{
System.out.print(temp.cData);
localStack.push(temp.leftChild);
localStack.push(temp.rightChild);
if(temp.leftChild != null ||
temp.rightChild != null)
isRowEmpty = false;
}
else
{
System.out.print("--");
localStack.push(null);
localStack.push(null);
}
for(int j=0; j<nBlanks*2-2; j++)
System.out.print(' ');
}  // end while globalStack not empty
System.out.println();
nBlanks /= 2;
while(localStack.isEmpty()==false)
globalStack.push( localStack.pop() );
}  // end while isRowEmpty is false
System.out.println(
"......................................................");
}  // end displayTree()
//-------------------------------------------------------------
}  // end class Tree
public class TreeApp{
public static void main(String[] args) {
Tree tree = new Tree();
tree.insert('1');
tree.insert('+');
tree.insert('6');
tree.insert('/');//2+6/2*3^2+3
tree.insert('2');
tree.insert('*');
tree.insert('3');
tree.insert('^');
tree.insert('2');
tree.insert('+');
tree.insert('7');
tree.displayTree();

long result = tree.calculate();
System.out.println("----"+result+"----");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: