题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
题目中用到栈,可以选择用java.util.Stack类,作者想自己写一个,所以就没用。
自己写栈类的话, 也是参考了java.util.Stack类源码,
第一,栈需要一个容器,我们选择用数组来做容器,容器的初始大小设为10.当栈里数据要超过10时,自动扩容。参看扩容源代码:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
这里我们不需要做的那么复杂就用最后一句话即可
elementData = Arrays.copyOf(elementData, newCapacity);
自己写的简单版栈代码如下:
public class test1 {
/**
* 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
* @param args
*/
public static void main(String[] args){
StackTest<String> stackTest=new test1().new StackTest<String>();
stackTest.push("1");
stackTest.push("2");
stackTest.push("3");
stackTest.push("4");
stackTest.push("5");
stackTest.push("6");
stackTest.push("7");
stackTest.push("8");
stackTest.push("9");
stackTest.push("10");
stackTest.push("11");
stackTest.push("12");
System.out.println(stackTest.getSize());
System.out.println(stackTest.capacity);
}
/**
* 栈
* @author Administrator
*
* @param <T>
*/
class StackTest<T>{
//容器容量
int capacity=10;
//容器数组
protected Object[] elements=new Object[capacity];
//元素数量
int elementsCount;
//方法将元素放入栈内
protected T push(T node){
elements[elementsCount++]=node;
resetSize();
return node;
}
//方法将栈顶元素取出
protected void pop(){
elements[elementsCount--]=null;
}
//获取栈元素数量
protected int getSize(){
return elementsCount;
}
//根据条件扩容容器容量
protected void resetSize(){
if(elements.length-elementsCount<=0){
capacity=capacity+5;
elements = Arrays.copyOf(elements, capacity);
}
}
}
}
栈有了 队列就实现了,
添加元素到队尾:直接往栈1里push,
删除队头元素:将栈1的元素pop出来push到栈2,然后栈2pop最上边的元素就相当于删除队头元素。
实现代码如下:
/**
* 队列
* @author Administrator
*
* @param <T>
*/
class QueueTest<T>{
StackTest<T> stack1;
StackTest<T> stack2;
//添加元素到队尾
protected void appendTail(T node){
stack1.push(node);
}
//删除队列头部元素
protected T deletedHead(){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
题目2:两个队列实现一个栈
因为队列的实现比栈的实现稍微复杂一点,这里就不自己实现了,想自己实现的同学可以参看下边的文章
http://blog.youkuaiyun.com/javazejian/article/details/53375004
java提供现成的工具类链式队列LinkedList。
这里我只说下思路,就不码代码了;
pop方法的实现:假设对列1有n个元素,将队列1的前n-1个元素deletehead,然后addTrail到队列2,这样相当于将队列1的第n个元素pop出栈。
push的实现:队列addTrail即可