【算法】-- 【栈与队列的实现】

1.如何实现栈

1.数组实现栈

import java.util.Arrays;

public class MyStack<E> {

    private Object[] stack;
    private int size;//数组中存储元素的个数

    public MyStack(){
        stack = new Object[10]; //默认初始长度为10
    }

    //判断栈是否为空
    public boolean isEmpty(){
        return size ==0;
    }

    public E peek(){
        if (isEmpty()){
            return null;
        }
        return (E)stack[size - 1];
    }

    /**
     * 出栈
     * @return
     */
    public E pop(){
        E e = peek();
        stack[size - 1] =null;
        size--;
        return e;
    }

    /**
     * 入栈
     * @param item
     * @return
     */
    public E push(E item){
        ensureCapacity(size+1); //检查容量
        stack[size++] = item;
        return item;
    }

    //判断容器是否装满,若装满,则扩充数组空间
    private void ensureCapacity(int size) {
        int len = stack.length;
        if (size>len){//数组已经装满
            int newLen =10;//每次数组扩充的容量
            stack = Arrays.copyOf(stack,newLen);
        }
    }

    public static void main(String[] args) {
        MyStack<Integer> s = new MyStack<>();
        s.push(1);
        s.push(2);
        s.push(3);
        System.out.println("栈中元素个数为:"+s.size);
        System.out.println("栈顶元素为:"+s.pop());
        System.out.println(s.peek());
        System.out.println("栈顶元素为:"+s.pop());
        System.out.println(s.peek());
    }

}

2.链表实现栈
链表类

public class Node<E>{
    Node<E> next =null;
    E data;
    public Node(E data){
        this.data = data;
    }
}
public class Stack<E> {
    Node<E> top = null;

    public boolean isEmpty(){
        return top == null;
    }

    public void push(E data){
        Node<E> newNode = new Node<>(data);
        newNode.next = top;
        top = newNode;
    }

    public E pop(){
        if (isEmpty())
            return null;

        E data = top.data;
        top = top.next;
        return data;
    }

    public E peek(){
        if (isEmpty())
            return null;
        return top.data;
    }
}

2.如何用O(1)的时间复杂度求栈中的最小元素

public class MyStack1 {
    MyStack<Integer> elem;
    MyStack<Integer> min;

    public MyStack1(){
        elem = new MyStack<>();
        min = new MyStack<>();
    }

    public void push (int data){
        elem.push(data);
        if (min.isEmpty()){
            min.push(data);
        }else {
            if (data<min.peek()){
                min.push(data);
            }
        }
    }

    public int pop(){
        int topData = elem.peek();
        elem.pop();
        if (topData==this.min()){
            min.pop();
        }
        return topData;
    }

    private int min() {
        if (min.isEmpty())
            return Integer.MAX_VALUE;
        else
            return min.peek();
    }
}

3.如何实现队列

链表实现队列

public class MyQueue<E> {

    private Node<E> head =null;
    private Node<E> tail =null;

    public boolean isEmpty(){
        return head==tail;
    }

    public void put(E data){
        Node<E> newNode = new Node<E>(data);
        if (head==null&&tail==null)//队列为空
            head=tail=newNode;
        else{
            tail.next=newNode;
            tail=newNode;
        }
    }
    public E pop(){
        if (this.isEmpty()){
            return null;
        }
        E data = head.data;
        head = head.next;
        return data;
    }

    public int size(){
        Node<E> tmp =head;
        int n=0;
        while (tmp!=null){
            n++;
            tmp=tmp.next;
        }
        return n;
    }


    public static void main(String[] args) {
        MyQueue<Integer> q = new MyQueue<>();
        q.put(1);
        q.put(2);
        q.put(3);
        System.out.println("队列的长度为:"+q.size());
        System.out.println("队列的首元素为:"+q.pop());
        System.out.println("队列的首元素为:"+q.pop());
    }

}

数组实现队列

import java.util.LinkedList;

public class MyQueue1<E> {
    private LinkedList<E> list = new LinkedList<>();
    private int size = 0;
    public synchronized void put(E e){
        list.addLast(e);
        size++;
    }
    public synchronized E pop(){
        size--;
        return list.removeFirst();
    }
    public synchronized boolean isEmpty(){
        return size==0;
    }
    public synchronized int size(){
        return size;
    }
}

4.如何用两个栈模拟队列

public class MyQueue2<E> {
    private Stack<E> s1 =new Stack<>();
    private Stack<E> s2 =new Stack<>();

    private synchronized void put(E e){
        s1.push(e);
    }
    public synchronized E pop(){
        if (s2.isEmpty())
            while (!s1.isEmpty())
                s2.push(s1.pop());
        return s2.pop();
    }
    public synchronized boolean isEmpty(){
        return s1.isEmpty()&&s2.isEmpty();
    }

    public static void main(String[] args) {
        MyQueue2<Integer> q = new MyQueue2<>();
        q.put(1);
        q.put(2);
        q.put(3);
        System.out.println("队列的首元素为:"+q.pop());
        System.out.println("队列的首元素为:"+q.pop());
        System.out.println("队列的首元素为:"+q.pop());
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值