数据结构与算法之栈

 

目录

顺序栈:

链式栈:

栈的使用: 


 首先:栈是一个特殊的线性表,只允许在一端进行插入(压栈)和删除元素(进栈),这一端称为栈顶。

栈的实现可以用数组实现,称为顺序栈。时间复杂度为O(1)

也可以用链表实现称为链式栈。尾插入栈:O(n),出栈:O(n)
                                                  头插入栈:O(1),从头出栈O(1)

顺序栈:

数组实现栈代码如下(运用了泛型,top下标:代表的是当前可以存放数据元素的下标。

入栈:放入元素到top下标,top++

出栈:top--

出栈和入栈的时间复杂度都是O(1)

package stack.com;

public class MyStack<T> {
    public T elem[];
    int top; //top是当前能放元素位置的下标

    public MyStack() {
        this.elem = (T[]) new Object[10];
        this.top = 0;
    }

    //判断是否未满
    private boolean isEmpty() {
        return top == elem.length;
    }

    //入栈
    public void push(T val) {
        if (isEmpty()) {
            return;
        }
        elem[top] = val;
        top++;
    }

    //判断是否为空
    private boolean isFull() {
        return top == 0;
    }

    //出栈
    public T pop() {
        if (isEmpty()) {
            return null;
        }
        T tmp = elem[top-1];
        top--;
        return tmp;
    }

    //查看栈顶元素
    public T peek() {
        return elem[top-1];
    }

}

链式栈:

时间复杂度:尾插入栈:O(n) 出栈:O(n);头插入栈:O(1)出栈从头出:O(1)

因此用链式栈采用头插法,从头出栈。

package stack.com;

public class MyListStack {
    class Node {
        int data;
        Node next;

        public Node(int data) {
            this.data = data;
        }
    }
    Node head;

    //入栈
    public void push(int val) {
        Node node = new Node(val);
        node.next = this.head;
        this.head = node;
    }

    //判断是否为空
    private boolean isEmpty() {
        return head == null;
    }

    //出栈
    public int pop() {
        if (isEmpty()) {
            return -1;
        }
        int tmp = head.data;
        head = head.next;
        return tmp;
    }

    //查看栈顶元素
    public int peek() {
        if (isEmpty()) {
            return -1;
        }
        return head.data;
    }


}

Java中的栈: 

public static void main(String[] args) {
    Stack<Integer> stack = new Stack<>();
    stack.push(1); //压栈
    stack.pop(); //出栈
    stack.peek(); // 查看栈顶元素
    System.out.println(stack.empty()); //判断栈是否为空
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值