第五章 栈和队列

概念

  • 栈:又称堆栈,是运算受限的线性表。

  • 仅允许在表的一端插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。

  • 表中进行插入、删除操作的一端称为栈顶,栈顶保存的元素称为栈顶元素,相对的,表的另一端称为栈底。

  • 当栈中没有元素的时称为空栈。

特点

  • 由于栈的插入和删除操作仅在栈顶进行,所以后入栈的必定先出

  • LIFO(last in frist out) 后进先出

  • 跟栈操作相关:push ,pop ,peek(获取栈顶元素)

       public interface Stack{
           public int getSize();//返回堆栈的大小
           public boolean isEmpty();//判断堆栈是否为空
           public void push(Object e);//将元素e压栈
           public Object pop();//栈顶元素出栈
           public Object peek();//取栈顶的元素      
       }
    

栈的存储结构

顺序栈

  • 使用顺序存储结构实现的堆栈,即用一组地址连续的存储单元依次存放堆栈中的数据元素。
  • 由于堆栈是一种特殊的线性表,因此在线性表的顺序存储结构的基础上,选择线性表的一端作为栈顶即可
  • 根据数组操作的特性,选择数组下标大的一端,即线性表顺序存储的表尾作为栈顶
  • 由于堆栈的操作都是在栈顶完成的,因此在顺序栈的实现中需要附设置一个指针top来动态的只是栈顶元素在数组中的位置
  • 通常top可以用栈顶元素所在的数组下标来表示,top=-1,表示空栈。

链栈

  • 链栈采用链表作为存储结构实现的栈。
  • 当采用单链表存储线性表后,根据单链表的操作特性选择单链表的头部作为栈顶
  • 由于栈顶的操作只在线性表的一端进行,在这里用带头结点的单链表或者不带头结点的单链表都可以
  • 使用带头结点的单链表时,结点的插入和删除都在头结点之后进行
  • 使用不带头结点的单链表时,,结点的插入和删除都在链表的首结点上进行

队列

概念

  • 简称队,它同堆栈一样,也是一种运算受限制的线性表
  • 其限制是仅允许在表的一端进行插入
        public interface Queue{
            public int getSize();
            public boolean isEmpty();
            public void enqueue(Object e);元素e入队
            public Object dequeue();队首元素出队
            public Object peek();
        }
    

顺序队列

方法一:数组作为存储结构

  • 有头指针和尾指针
  • 如果有元素出队列,那么头指针之前的空间就不能用了,导致大量的空间浪费。

方法二:使用过循环数组作为存储结构

  • 末尾元素的下一个元素不是数组外,而是数组的头元素,这样就能使用头指针之前的元素了

链式队列

  • 队列的链式存储可以使用带头结点单链表来实现
  • 链表的头部作为队首,链表的尾部作为队尾
  • 需要有指向链表头节点和链表尾结点的引用
  • 设计了两个指针,一个队首指针和一个队尾指针
  • 队首指针指向队首元素的前一个空结点,队尾指针指向队尾元素所在的结点
  • 空队列的时候,队首和队尾指针都指向空的头节点。
  • 入队的时候,最后的元素指向新入栈元素,指针后移到新元素的结点
  • 出队列的时候,头结点指向第二个元素的结点,把第二个元素当作是新的队首

双端队列deque(double ended queue)

  • 所谓双端队列就是两端都可以进行入队和出队操作的队列

  • 双端队列:进队的时候,前端进的元素排在后端进的元素的前面;出队的时候,无论前端出还是后端出,先出的元素排在后出元素的前面。

  • 输出受限的双端队列:一个端点允许插入和输出,另一个端点只允许插入。

  • 输入受限的双端队列:一个端点允许插入和输出,另一个端点只允许输出。

  • 如果一端只允许进,另一端只允许出,普通的链表

  • 如果只允许一端插入和输出,另一端不允许操作,则是栈

  • java中的线性表:vector,Array List,LinkedList

  • Java中的栈和队列:Stack extends Vector(overtime),Queue接口,Deque栈操作时建议用。

代码分析

Deque 继承 Queue

子类有Array Queue(用的不多) 和 LikedList

LikedList既可以当作占用,也可以当作队列,还可以当作线性表

  • 用栈操作实现十进制转化为二进制
    public static void main(String[] args) {
             Deque stack = new LinkedList();
             Scanner sc = new Scanner(System.in);
             System.out.println("please click zhe number you want:");
             int m = sc.nextInt();
             int t = m;
             
             while(t>0){
                 int mod = t % 2;
                 stack.push(mod);
                 t = t/2;
             }
             System.out.print(m+"的二进制是:");
             while (!stack.isEmpty()){
                 System.out.print(stack.pop());
             }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值