数据结构与算法(Java版)

第三章:栈和队列


文章目录

目录

第三章:栈和队列

文章目录

前言

        难度适中,请放心食用!!!

一、栈的定义和特点

栈(Stack)是只允许在一端进行插入或删除操作的线性表。

栈顶Top:线性表允许插入和删除的那一端。

栈底Bottom:固定的,不允许进行插入和删除的另一端。

可视化网站如下:

栈的特点:1. 后进先出,后进栈的元素先出栈。

2.只能在栈顶进行插入和删除操作。

二、栈的存储和基本操作

栈有两种存储方式:顺序栈和链栈

顺序栈:采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,同时附设一个指针(top)指示当前栈顶的位置。

链栈:采用链式存储的栈称为链栈,链栈便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并且所有操作都是在单链表的表头进行的。

1.顺序栈的存储及基本运算算法的实现

顺序栈的四要素:

1.栈空条件:top==-1。

2.栈满条件:top=capacity - 1,这里采用动态扩展容量的方式,即栈满时将data数组的容量扩大两倍。

3.进栈e操作:先将栈顶指针top增1,然后将元素e放在栈顶指针处。

4.退栈操作:先将栈顶指针top处的元素取出,然后将栈顶指针减1。 注意: 栈内元素没删除。

顺序栈泛型类SqStackClass设计如下:

顺序栈基本运算算法如下:

2.链栈的存储存储及基本运算算法的实现

链栈的四要素:

1.栈空条件:head.next = = null。

2.栈满条件:只有在内存溢出的时候才会出现栈满,通常不考虑这种情况。

3.进栈e操作:将包含该元素的节点s插入作为首节点。

4.出栈操作:返回首节点值并删除该节点。

代码如下:

前言

        难度适中,请放心食用!!!

一、栈的定义和特点

栈(Stack)是只允许在一端进行插入或删除操作的线性表。

栈顶Top:线性表允许插入和删除的那一端。

栈底Bottom:固定的,不允许进行插入和删除的另一端。

可视化网站如下:

Array Stack Visualizationicon-default.png?t=N7T8https://www.cs.usfca.edu/~galles/visualization/StackArray.html

栈的特点:1. 后进先出,后进栈的元素先出栈。

2.只能在栈顶进行插入和删除操作。

二、栈的存储和基本操作

栈有两种存储方式:顺序栈和链栈

顺序栈:采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,同时附设一个指针(top)指示当前栈顶的位置

链栈:采用链式存储的栈称为链栈,链栈便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并且所有操作都是在单链表的表头进行的。

1.顺序栈的存储及基本运算算法的实现

顺序栈的四要素:

  • 1.栈空条件:top==-1。

  • 2.栈满条件:top=capacity - 1,这里采用动态扩展容量的方式,即栈满时将data数组的容量扩大两倍。

  • 3.进栈e操作:先将栈顶指针top增1,然后将元素e放在栈顶指针处。

  • 4.退栈操作:先将栈顶指针top处的元素取出,然后将栈顶指针减1。 注意: 栈内元素没删除。

顺序栈泛型类SqStackClass<E>设计如下:

public class SqStackClass <E>//顺序栈泛型类
{
    final  int initcapacity = 10;//顺序栈的初始容量(常量)
    private int capacity;//存放栈的容量
    private E[] data;//存放顺序栈的元素
    private int top;//存放栈顶指针
    public  SqStackClass(int newcapacity)//构造方法,实现初始化data,top
    {
        data = (E[]) new Object[newcapacity];//强制转换成E类型数据
        capacity = newcapacity;
        top = -1;
    }
    private void updatecapacity(int newcapacity)//改变顺序栈的容量为newcapacity
    {
        E[] newdata = (E[]) new Object[newcapacity];
        for (int i=0;i<= top;i++)//复制原来的元素
            newdata[i]=data[i];
        capacity = newcapacity;//设置新容量
        data = newdata;//仍有data标识数组
    }
    //栈的基本运算算法
}

顺序栈基本运算算法如下:

    public class J1<E>{
    //顺序栈的基本运算算法
    public boolean empty()//判断栈是否为空
    {
        return top == -1;
    }
    public void push(E e)//元素e进栈
    {
        if (top == capacity-1)//空间满时倍增容量
            updatecapacity(2*top+1);
        top++;                 //栈顶指针增加1
        data[top] = e;
    }
    public E pop()//出栈操作
    {
        if (empty())
            throw new IllegalArgumentException("栈空");
        E e = (E)data[top];
        top--;
        if (capacity>initcapacity&&top+1 == capacity/4)
            updatecapacity(capacity/2);
        return e;
    }
    public E peek()//取栈顶元素操作
    {
        if (empty())
            throw new IllegalArgumentException("栈空");
        return (E)data[top];
    }
}

2.链栈的存储存储及基本运算算法的实现

链栈的四要素:

  • 1.栈空条件:head.next = = null。

  • 2.栈满条件:只有在内存溢出的时候才会出现栈满,通常不考虑这种情况。

  • 3.进栈e操作:将包含该元素的节点s插入作为首节点。

  • 4.出栈操作:返回首节点值并删除该节点。

代码如下:

import java.net.PortUnreachableException;

class LinkNode<E>//链栈点泛型类
{
    E data;
    LinkNode<E> next;
    public LinkNode()//构造方法
    {
       next = null;
    }
    public  LinkNode(E d)//重载构造方法
    {
        data = d;
        next = null;
    }


}
public class LinkStackClass<E>//链栈泛型类
{
    LinkNode<E>head;//存放头节点
    public LinkStackClass()//构造方法
    {
        head = new LinkNode< E >();//创建头节点
        head.next = null;//设置为空栈
    }
    //栈的基本运算算法
    public boolean empty()//判断栈是否为空
    {
        return head.next== null;
    }
    public void push(E e)//元素e进栈
    {
        LinkNode<E>s = new LinkNode<E>(e);//新建结点s
        s.next = head.next;//将s插入表头
        head.next = s;
    }
    public E pop()//出栈操作
    {
        if (empty())
            throw new IllegalArgumentException("栈空");
        E e = (E)head.next.data;//取首结点值
        head.next=head.next.next;
        return e;
    }
    public E peek()//取栈顶元素操作
    {
        if (empty())
            throw new IllegalArgumentException("栈空");
        E e = (E)head.next.data;//取首结点值
        return e;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值