数据结构基础 栈的详解

Posted 有头发的程序猿#

tags:

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

一.栈的定义

栈(stack)是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入和删除操作的一端称为栈顶,最下面的那一端称为栈底。栈顶是动态的,它由一个称为栈顶指针的位置指示器指示。当栈中没有数据元素时,称之为空栈。栈的插入操作也称为进栈或入栈,栈的删除操作称为出栈或退栈。

栈的特点是先进后出

二.栈的基本操作

初始栈:创建一个空栈
入栈:在栈顶添加一个数据元素
出栈:删除栈顶数据元素
取栈顶元素:获取栈中当前栈顶的数据元素,栈中数据元素不变
求栈长度:获取栈中的数据元素个数
判断栈空:判断栈中是否有数据元素

三.栈的抽象数据类型

ADT 栈(stack)
数据元素 可以是任意类型,只要同属一个数据对象即可;
数据关系 数据元素之间呈线性关系,假设栈中有n个元素(a1, a2,a3,…,an),则对
每一个元素ai(i=1,2,…,n-1)都存在关系(ai,ai+1),并且a1无前趋,an无后继。
数据操作 将对栈的基本操作定义在接口IStack中,代码如下:

public interface IStack<E> 
E push(E item);//入栈
E pop(); //出栈
E peek(); //取栈顶元素
int size(); //求栈的长度
void clear();//清空栈
boolean isEmpty(); //判断栈是否为空

四.用顺序栈实现栈

1.顺序栈的存储结构:
用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(sequence stack)。
栈顶指示器top设在数组第一个元素前面的位置,top随着插入和删除而变化,当栈为空时,top=-1
2.实现顺序栈的接口

public interface IStack<E>
    E push(E e); //入栈
    E pop(); //出栈
    E peek();//取栈顶元素
    boolean isEmpty();//判断栈是否为空
    int size();//栈的尺寸
    void clear();//清空栈

3.实现顺序栈

public class SeqStack<E> implements IStack<E>
    private int maxsize;  //栈的最大容量
    private int top;  //栈顶指针
    private Object arr[];

    public SeqStack(int maxsize)
        arr = new Object[maxsize];
        this.maxsize = maxsize;
        top=-1;
    
    public E push(E e) 
        if(!isFull())
            arr[++top] = e;
            return e;
        
        return null;
    

    public E pop() 
        if(!isEmpty())
            return (E) arr[top--];
        
        return null;
    

    public E peek() 
         if(!isEmpty())
             return (E) arr[top];
         
         return null;
    

    public boolean isEmpty() 
        if(top == -1)
            return true;
        
        else return false;
    

    public int size() 
        if(!isEmpty())
            return top+1;
        
       return 0;
    

    public void clear() 
        if (!isEmpty())
            top=-1;
        

    
    public boolean isFull()
        if (top == maxsize)
            return true;
        
        else return false;
    

4.测试顺序栈

public class TestSeqStack 
    public static void main(String []args)
        Integer data[] =1,24,32,3,33;
        SeqStack<Integer> seqStack = new SeqStack<Integer>(5);

        System.out.println("*******************");
        for(int i= 0;i<5;i++)
            System.out.print("入栈:"+data[i]);
            seqStack.push(data[i]);
            System.out.println();
        
        System.out.println("*******************");
        while(true)
            if(seqStack.isEmpty())
                break;
            
            System.out.print("出栈:"+seqStack.pop().intValue());

            System.out.println();
        
    

五.用链栈实现栈

1.链栈的存储结构
链式存储结构存储的栈称为链栈(linked stack)。链栈通常用单链表来表示。
链栈结点的结构与单链表结点的结构一样,由数据域data和引用域next两部分组成。
栈顶指示器指向最后一个入链的元素。
2.单链节点

public class StackNode<E> 
    private E data;
    private StackNode<E> next; //指向下一个节点

    public StackNode()
    public StackNode(E data) 
        this.data = data;
    

    public StackNode(E e, StackNode<E> e1)
        this.data = e;
        this.next = e1;

    

    public E getData() 
        return data;
    

    public void setData(E data) 
        this.data = data;
    

    public StackNode<E> getNext() 
        return next;
    

    public void setNext(StackNode<E> next) 
        this.next = next;
    

3.单链节点实现链栈

public class LinkStack<E> implements IStack<E> 
    private StackNode<E> top;
    private int size;

    public LinkStack()
        top = new StackNode<E>(null,null);
        size=0;
    
    public E push(E e) 
        StackNode<E> node = new StackNode<E>(e,top.getNext());
        top.setNext(node);
        size++;
        return e;
    

    public E pop() 
        if(top.getNext() !=null)
            E e = top.getNext().getData();
            top.setNext(top.getNext().getNext());
            size--;
            return e;
        
        return null;
    

    public E peek() 
        if(top.getNext()!=null)
            return top.getNext().getData();
        
        return null;
    

    public boolean isEmpty() 
        if(top.getNext()!=null)
            return false;
        
        return true;
    

    public int size() 
        return size;
    

    public void clear() 
        top.setNext(null);
    

4.测试

public class TestLinkStack 
    public static void main(String []args)
        Integer data[] =1,24,32,3,33;
        LinkStack<Integer> linkStack = new LinkStack<Integer>();

        System.out.println("*******************");
        for(int i= 0;i<5;i++)
            System.out.print("入栈:"+data[i]);
            linkStack.push(data[i]);
            System.out.println();
        
        System.out.println("*******************");
        while(true)
            if(linkStack.isEmpty())
                break;
            
            System.out.print("出栈:"+linkStack.pop().intValue());

            System.out.println();
        
    


六.总结

到了这里,栈的知识大概就差不多了解了。
如果有什么问题,欢迎大家评论指出,3q!

附上视频教学连接:
中国MOOC数据结构

以上是关于数据结构基础 栈的详解的主要内容,如果未能解决你的问题,请参考以下文章

java基础学习堆和栈的区别详解

2.堆.栈和内存映射详解

堆和栈的区别——详解

GShang博客园主题基础版本适配教程详解

详解数据结构中栈的定义和操作

C语言实现数据结构之栈的详解