数据结构与算法-栈和队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法-栈和队列相关的知识,希望对你有一定的参考价值。

一、简介

众所周知,线性表是数据结构的基础,通常有两种实现方式:数组和链表。栈和队列是最常用的数据结构,它们基于线性表实现。

 

二、栈

定义:栈是限定仅在表尾进行插入和删除操作的线性表,即FILO。

栈被经常类比于弹夹,即先被压如弹夹的子弹最后被打出。根据线性表的实现方式得知,栈的实现方式有两种:数组实现和链表实现。

 

栈的数组实现:

package basic.data_structure.cha01;

/**
 * 栈:先进后出(FILO),只允许在栈顶操作元素
 * 栈的基本操作:
 *  初始化栈、弹栈、压栈、获取栈顶元素、判断是否为空
 *  
 *  
 * 用数组实现栈。
 * */
public class ArrayStack<T> {

    private T[] data;     //数据容器
    private int maxSize;  //栈容量
    private int top = -1; //栈顶指针
    
    
    public ArrayStack(){ this(10); }
    //初始化栈
    public ArrayStack(int capacity){
        if(capacity > 0){
            data = (T[])new Object[capacity];
            maxSize = capacity;
            top = -1;
        }else{
            throw new RuntimeException("栈的初始化大小不能小于或等于0");
        }
    }
    
    public boolean isEmpty(){
        return top == -1;
    }
    
    //压栈
    public boolean push(T elem){
        if(top == maxSize - 1){
            throw new RuntimeException("栈满");
        }
        
        data[++top] = elem;
        return true;
    }
    
    //获取栈顶元素(不移除)
    public T peek(){
        if(this.isEmpty()){
            throw new RuntimeException("空栈");
        }
        return data[top];
    }
    
    
    //弹栈
    public T pop(){
        if(this.isEmpty()){
            throw new RuntimeException("空栈");
        }
        return data[--top];
    }
}

很容易理解,都是实际上都是线性表的基本操作。

 

栈的链表实现:

package basic.data_structure.cha01;


/**
 * 栈:先进后出 FILO,只允许在栈顶操作元素
 * 栈的基本操作:
 *      初始化栈、压栈、弹栈、获取栈顶元素、当前栈大小
 * 
 * 栈的链表实现
 * */
public class LinkedStack<T> {

    private int currentSize;//当前栈大小(链表栈没有大小限制)
    private Node<T> top;    //头节点
    
    
    //初始化栈
    public LinkedStack(){
        top = null;  //头指针为空
    }
    
    public boolean isEmpty(){
        return top == null;
    }
    
    public int length(){
        return currentSize;
    }
    
    //压栈
    public boolean push(T elem){
        Node<T> node = new Node<T>(elem, top);
        top = node;
        currentSize ++;
        
        return true;
    }
    
    //获取栈顶元素
    public T peek(){
        if(this.isEmpty()){
            throw new RuntimeException("空栈");
        }
        
        return top.data;
    }
    
    //弹栈
    public T pop(){
        if(this.isEmpty()) {
            throw new RuntimeException("空栈");
        }
        Node<T> node = top;
        top = top.next;
        node.next = null;
        currentSize --;
        
        return node.data;
    }
    
    //节点(内部类)
    private static class Node<T>{
        T data;           //数据域
        Node<T> next;     //链域
        public Node(){}
        public Node(T data, Node<T> next){
            this.data = data;
            this.next = next;
        }
    }
    
}

 

以上是关于数据结构与算法-栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法学习笔记栈和队列

数据结构与算法学习笔记 栈和队列Ⅰ

数据结构与算法系列研究二——栈和队列

数据结构与算法第三章:表栈和队列

数据结构与算法分析表栈和队列

《数据结构与算法》-3-栈和队列