Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
onlyliuxin committed May 3, 2017
2 parents 33943f1 + 7132e32 commit 2df0ad0
Show file tree
Hide file tree
Showing 40 changed files with 1,907 additions and 14 deletions.
Binary file added group19/527220084/lite-file-downloader.zip
Binary file not shown.
Binary file added group19/527220084/lite-struts-tdd.zip
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package org.xukai.coderising.queue;

/**
* 用数组实现循环队列
* @author liuxin
*
* @param <E>
*/
public class CircleQueue <E> {

private final static int DEFAULT_SIZE = 10;

private int count = 0;

//用数组来保存循环队列的元素
private Object[] elementData = new Object[DEFAULT_SIZE] ;

//队头
private int front = 0;
//队尾
private int rear = 0;

public boolean isEmpty() {
return count == 0;

}

public int size() {
return count;
}



public void enQueue(E data) {
if (count == DEFAULT_SIZE ) {
throw new RuntimeException();
}
elementData[front] = data;
front = (front + 1) % DEFAULT_SIZE;
count++;
}

public E deQueue() {
if (count == 0) {
return null;
}
count--;
E e = (E)elementData[rear];
rear = (rear + 1) % DEFAULT_SIZE;
return e;
}

public static void main(String[] args) {
CircleQueue<Integer> queue = new CircleQueue<>();
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
queue.enQueue(4);
queue.enQueue(5);
queue.enQueue(6);
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());System.out.println(queue.deQueue());System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
queue.enQueue(7);
queue.enQueue(8);
queue.enQueue(9);
queue.enQueue(0);
queue.enQueue(1);
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());

}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.xukai.coderising.queue;

import com.google.common.base.Preconditions;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;

/**
* 用Queue来实现Josephus问题
* 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来
* 该方法返回一个List, 包含了被杀死人的次序
* @author liuxin
*
*/
public class Josephus {


public static List<Integer> execute(int n, int m){
Preconditions.checkArgument(n > 0);
ArrayList<Integer> deadList = new ArrayList<>();
ArrayDeque<Integer> deque1 = new ArrayDeque<>();
ArrayDeque<Integer> deque2 = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
deque1.offer(i);
}
int count = 0;
while(n >= m){
if (deque1.isEmpty()) {
while (!deque2.isEmpty()){
deque1.offer(deque2.poll());
}
}
count++;
if (count == m) {
deadList.add(deque1.poll());
count = 0;
n--;
continue;
}
deque2.offer(deque1.poll());

}

return deadList;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.xukai.coderising.queue;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;



public class JosephusTest {

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testExecute() {

Assert.assertEquals("[1, 3, 5, 0, 4, 2]", Josephus.execute(7, 2).toString());



}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package org.xukai.coderising.queue;

import java.util.Stack;

/**
* 用两个栈来实现一个队列
* @author liuxin
*
* @param <E>
*/
public class QueueWithTwoStacks<E> {
private Stack<E> stack1;
private Stack<E> stack2;


public QueueWithTwoStacks() {
stack1 = new Stack<E>();
stack2 = new Stack<E>();
}




public boolean isEmpty() {
return stack1.isEmpty();
}



public int size() {
return stack1.size();
}



public void enQueue(E item) {
stack1.push(item);
}

public E deQueue() {
if (stack1.isEmpty()) {
return null;
}
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
E e = stack2.pop();
while (!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
return e;
}

public static void main(String[] args) {
QueueWithTwoStacks queue = new QueueWithTwoStacks();
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
queue.enQueue(4);
queue.enQueue(5);
queue.enQueue(6);
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());System.out.println(queue.deQueue());System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
queue.enQueue(7);
queue.enQueue(8);
queue.enQueue(9);
queue.enQueue(0);
queue.enQueue(1);
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());


}

}

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@

import org.xukai.jvm.clz.ClassFile;
import org.xukai.jvm.constant.ConstantPool;
import org.xukai.jvm.engine.ExecutionResult;
import org.xukai.jvm.engine.Heap;
import org.xukai.jvm.engine.JavaObject;
import org.xukai.jvm.engine.StackFrame;

public class BiPushCmd extends OneOperandCmd {

Expand All @@ -16,7 +20,12 @@ public String toString(ConstantPool pool) {

return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand();
}



@Override
public void execute(StackFrame frame, ExecutionResult result) {
JavaObject javaObject = Heap.getInstance().newInt(getOperand());
frame.getOprandStack().push(javaObject);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import org.xukai.jvm.clz.ClassFile;
import org.xukai.jvm.constant.ConstantInfo;
import org.xukai.jvm.constant.ConstantPool;
import org.xukai.jvm.engine.ExecutionResult;
import org.xukai.jvm.engine.StackFrame;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -14,7 +16,42 @@ public abstract class ByteCodeCommand {
String opCode;
ClassFile clzFile;
private int offset;


public static final String aconst_null = "01";
public static final String new_object = "BB";
public static final String lstore = "37";
public static final String invokespecial = "B7";
public static final String invokevirtual = "B6";
public static final String getfield = "B4";
public static final String putfield = "B5";
public static final String getstatic = "B2";
public static final String ldc = "12";
public static final String dup = "59";
public static final String bipush = "10";
public static final String aload_0 = "2A";
public static final String aload_1 = "2B";
public static final String aload_2 = "2C";
public static final String iload = "15";
public static final String iload_1 = "1B";
public static final String iload_2 = "1C";
public static final String iload_3 = "1D";
public static final String fload_3 = "25";

public static final String voidreturn = "B1";
public static final String ireturn = "AC";
public static final String freturn = "AE";

public static final String astore_1 = "4C";
public static final String if_icmp_ge = "A2";
public static final String if_icmple = "A4";
public static final String goto_no_condition = "A7";
public static final String iconst_0 = "03";
public static final String iconst_1 = "04";
public static final String istore_1 = "3C";
public static final String istore_2 = "3D";
public static final String iadd = "60";
public static final String iinc = "84";

private static Map<String,String> codeMap = new HashMap<String,String>();

static{
Expand Down Expand Up @@ -125,5 +162,5 @@ public String getReadableCodeText(){
return txt;
}

//public abstract void execute(StackFrame frame,FrameResult result);
public abstract void execute(StackFrame frame, ExecutionResult result);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@

import org.xukai.jvm.clz.ClassFile;
import org.xukai.jvm.constant.ConstantPool;
import org.xukai.jvm.constant.FieldRefInfo;
import org.xukai.jvm.engine.ExecutionResult;
import org.xukai.jvm.engine.JavaObject;
import org.xukai.jvm.engine.StackFrame;

public class GetFieldCmd extends TwoOperandCmd {

Expand All @@ -13,10 +17,22 @@ public GetFieldCmd(ClassFile clzFile, String opCode) {
@Override
public String toString(ConstantPool pool) {

return super.getOperandAsField(pool);
return super.getOperandAsField(clzFile.getConstantPool());
}


@Override
public void execute(StackFrame frame, ExecutionResult result) {

FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex());
String fieldName = fieldRef.getFieldName();
JavaObject jo = frame.getOprandStack().pop();
JavaObject fieldValue = jo.getFieldValue(fieldName);

frame.getOprandStack().push(fieldValue);



}


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

import org.xukai.jvm.clz.ClassFile;
import org.xukai.jvm.constant.ConstantPool;
import org.xukai.jvm.engine.ExecutionResult;
import org.xukai.jvm.engine.StackFrame;

public class GetStaticFieldCmd extends TwoOperandCmd {

Expand All @@ -17,4 +19,9 @@ public String toString(ConstantPool pool) {
return super.getOperandAsField(pool);
}

@Override
public void execute(StackFrame frame, ExecutionResult result) {

}

}
Loading

0 comments on commit 2df0ad0

Please sign in to comment.