Java实现队列和栈

package teststack;

/**
 * 基于数组实现的顺序栈
 * @param <E>
 */
public class Stack<E> {
    private Object[] data = null;
    private int maxSize=0;   //栈容量
    private int top =-1;  //栈顶指针
    
    /**
     * 构造函数:根据给定的size初始化栈
     */
    Stack(){
        this(10);   //默认栈大小为10
    }
    
    Stack(int initialSize){
        if(initialSize >=0){
            this.maxSize = initialSize;
            data = new Object[initialSize];
            top = -1;
        }else{
            throw new RuntimeException("初始化大小不能小于0:" + initialSize);
        }
    }
    
    //判空
    public boolean empty(){
        return top==-1 ? true : false;
    }
    
    //进栈,第一个元素top=0;
    public boolean push(E e){
        if(top == maxSize -1){
            throw new RuntimeException("栈已满,无法将元素入栈!");
        }else{
            data[++top]=e;
            return true;
        }    
    }
    
    //查看栈顶元素但不移除
    @SuppressWarnings("unchecked")
	public E peek(){
        if(top == -1){
            throw new RuntimeException("栈为空!");
        }else{
            return (E)data[top];
        }
    }
    
    //弹出栈顶元素
    public E pop(){
        if(top == -1){
            throw new RuntimeException("栈为空!");
        }else{
        	E e = (E)data[top];
        	data[top--]=null;
        	return e;
        }
    }
    
    //返回对象在堆栈中的位置,以 1 为基数
    public int search(E e){
        int i=top;
        while(top != -1){
            if(peek() != e){
                top --;
            }else{
                break;
            }
        }
        int result = top+1;
        top = i;
        return result;      
    }
}

链式存储结构实现:

package linkstack;

	public class LinkStack<E> {
	    //链栈的节点
	    private class Node<E>{
	        E e;
	        Node<E> next;
	        public Node(){}
	        public Node(E e, Node next){
	            this.e = e;
	            this.next = next;
	        }
	    }
	    
	    private Node<E> top;   //栈顶元素
	    private int size;  //当前栈大小
	    
	    public LinkStack(){
	        top = null;
	    }
	    
	    //当前栈大小
	    public int length(){
	        return size;
	    }
	    
	    //判空
	    public boolean empty(){
	        return size==0;
	    }
	    
	    //入栈:让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
	    public boolean push(E e){
	        top = new Node(e,top);
	        size ++;
	        return true;
	    }
	    
	    //查看栈顶元素但不删除
	    public E peek(){
	        if(empty()){
	            throw new RuntimeException("空栈异常!");
	        }else{
	            return top.e;
	        }
	    }
	    
	    //出栈
	    public E pop(){
	        if(empty()){
	            throw new RuntimeException("空栈异常!");
	        }else{
	            Node<E> value = top; //得到栈顶元素
	            top = top.next; //让top引用指向原栈顶元素的下一个元素 
	            value.next = null;  //释放原栈顶元素的next引用
	            size --;
	            return value.e;
	        }
	    }
}

LinkedList实现队列的实现

import java.util.LinkedList;

/**
 * 基于LinkedList实现栈
 * 在LinkedList实力中只选择部分基于栈实现的接口
 */
public class StackList<E> {
    private LinkedList<E> ll = new LinkedList<E>();
    
    //入栈
    public void push(E e){
        ll.addFirst(e);
    }
    
    //查看栈顶元素但不移除
    public E peek(){
        return ll.getFirst();
    }
    
    //出栈
    public E pop(){
        return ll.removeFirst();
    }
    
    //判空
    public boolean empty(){
        return ll.isEmpty();
    }
    
    //打印栈元素
    public String toString(){
        return ll.toString();
    }
}



<think>好的,我现在要帮用户解决如何使用Java的ArrayList来实现队列的问题。首先,我需要回忆一下队列的基本特性。队列是先进先出(FIFO),而是后进先出(LIFO)。ArrayList是动态数组,可以方便地添加删除元素,但需要根据数据结构的不同要求来调整操作的位置。 对于队列实现,用户提供的引用中已经有例子,比如用ArrayList的add方法在队尾添加元素,用remove(0)来移除队首元素。这点需要注意,因为频繁remove(0)可能会导致性能问题,毕竟ArrayList的底层是数组,每次移除第一个元素都需要移动后面的所有元素。不过用户可能只是需要基础实现,暂时不用考虑优化。 然后是实现的操作主要在顶,也就是列表的末尾。所以push操作可以用add方法,pop的话用remove(size()-1)。或者更简单的话,使用addremoveLast(但Java的ArrayList没有removeLast方法,不过可以用remove(list.size()-1))。另外,可能需要考虑的peek操作,即查看元素但不移除,可以用get(size()-1)。 接下来需要参考用户提供的引用内容。引用12展示了队列实现,引用4提到了的测试,但具体实现可能需要自己补充。比如,的接口可能包含push、pop、peek等方法。用户的问题主要是如何用ArrayList实现这两个结构,所以需要分别给出队列的代码示例。 另外,用户提供的引用3提到Queue是一个接口,通常用LinkedList实现,但用户希望用ArrayList,所以需要忽略LinkedList的方式,专注于ArrayList的方法。 在写代码的时候,需要注意泛型的使用,比如Queue<T>Stack<T>类,这样可以让它们支持不同类型的数据。同时,要处理可能的异常情况,比如当队列为空时,出队或出的操作应该如何处理。引用2中在poll方法里抛出了异常,但也可以返回null,这取决于设计选择。 另外,可能需要考虑线程安全的问题,但用户的问题可能不涉及,所以暂时忽略。 总结步骤: 1. 队列实现:入队用add,出队用remove(0),注意空队列的情况。 2. 实现:入用add,出用remove(size()-1),同样处理空的情况。 3. 编写示例代码,展示使用方法,如添加元素、移除元素,并打印结果。 4. 比较两者的区别,指出性能上的注意事项,比如ArrayList在头部操作的效率问题。 现在需要检查是否有遗漏的部分,比如是否需要其他方法(如isEmpty、size等),队列是否需要同样。根据引用中的代码,队列有size方法,也应该有类似的方法。另外,构造函数的初始化,比如ArrayList的初始化在队列的add方法中处理,可能在第一次使用时创建。 最后,确保代码符合Java语法,比如泛型的使用,方法的访问修饰符等。同时,根据用户提供的引用,可能需要引用相关的部分,比如在队列实现部分引用[^1][^2],的部分引用[^4]中的测试方法。</think>### 使用Java ArrayList实现队列 #### 一、队列实现(先进先出) 队列的核心操作是入队(队尾添加)出队(队首移除)。通过`ArrayList`的以下方法实现: - **入队**:`add()`方法直接添加元素到列表末尾,时间复杂度$O(1)$ - **出队**:`remove(0)`移除列表第一个元素,时间复杂度$O(n)$[^1][^2] ```java import java.util.ArrayList; public class ArrayListQueue<T> { private ArrayList<T> list = new ArrayList<>(); // 入队 public void enqueue(T item) { list.add(item); } // 出队 public T dequeue() { if (isEmpty()) return null; return list.remove(0); } // 查看队首 public T peek() { return isEmpty() ? null : list.get(0); } public int size() { return list.size(); } public boolean isEmpty() { return list.isEmpty(); } } ``` #### 二、实现(后进先出) 的核心操作是压顶添加)顶移除),均通过操作列表尾部实现: - **压**:`add()`方法添加元素到列表末尾,时间复杂度$O(1)$ - **弹**:`remove(list.size()-1)`移除列表最后一个元素,时间复杂度$O(1)$[^4] ```java import java.util.ArrayList; public class ArrayListStack<T> { private ArrayList<T> list = new ArrayList<>(); // 压 public void push(T item) { list.add(item); } // 弹 public T pop() { if (isEmpty()) return null; return list.remove(list.size() - 1); } // 查看顶 public T peek() { return isEmpty() ? null : list.get(list.size() - 1); } public int size() { return list.size(); } public boolean isEmpty() { return list.isEmpty(); } } ``` #### 三、性能对比 $$ \begin{cases} \text{队列出队时间复杂度} & O(n) \\ \text{操作时间复杂度} & O(1) \end{cases} $$ 队列的`remove(0)`操作因涉及数组元素前移,性能较低,数据量大时建议改用`LinkedList`[^3]。 #### 四、测试示例 ```java // 队列测试 ArrayListQueue<String> queue = new ArrayListQueue<>(); queue.enqueue("A"); queue.enqueue("B"); System.out.println(queue.dequeue()); // 输出A // 测试 ArrayListStack<Integer> stack = new ArrayListStack<>(); stack.push(10); stack.push(20); System.out.println(stack.pop()); // 输出20 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值