栈和队列的实现

今天说一下栈和队列的实现……

一、栈的基本概念与操作:

 

栈是一种特殊的线性表,只允许在一端实现插入删除的操作,插入删除的一端称之为栈顶,另一端称为栈底。栈遵循后进先出的原则。

压栈:指栈的插入操作,入数据在栈顶。

出栈:又叫弹栈,指栈的出数据操作,出数据在栈顶。

其基本操作的实现图……

05ae008ab6634e28b14e595f50fdccbe.png

375bd7caab0e4ff0be594b7e688bb75e.png

 

如图,栈的存储方式和数组类似,所以较为简单。因此,我们只需用到数组就可以解决问题。

第一步:创建一个数组

public class MyStack {
     int[] array;
     int size = 0;
     public MyStack(){
         this.array = new int[10];
     }
}
第二步:压栈操作

注意:压栈操作我们需要考虑一个问题,栈是否已

//定义一个方法判断栈是否已满

    public boolean isFull()

{

         return size == array.length;

}

接下来进行操作:

 public int push (int val){
         //如果是满的要扩容
         if(isFull()){
             array = Arrays.copyOf(array,2*array.length);
         }
         this.array[size] = val;
         size++;
         return val;
    }
 

第三步:出栈操作

注意:这里需要判断值是否为空的情况,可以创建一个异常类来报错

public class MyEmptyStackException extends RuntimeException{

    public MyEmptyStackException() {

    }

 

    public MyEmptyStackException(String message) {

        super(message);

    }

}

操作的实现:

 public int pop() {
         //判断元素是否为空
        if(empty()){
            throw new MyEmptyStackException("栈为空!");
        }
         //直接将栈首的元素记录输出即可
        int set = array[size-1];
        size--;
        return set;
    }
队列的基本概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的原则。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

9474b06400be45b1bf500e317a509db0.png

第一步:操作前准备

在这里实现相关操作我们用单链表的方法实现,我们可以定义两个变量分别指向队头和队尾,代码如下:

static class ListNode{
        public int val;
        public ListNode next;

        public ListNode(int val){
            this.val = val;
        }
    }
    //定义头尾结点
    public ListNode head;
    public ListNode tail;
    //定义一个计数变量
    public int size;
第二步:判断队列是否为空

    public boolean empty()

{
        return size == 0;
}

实现入队的操作:

public void offer(int val){
        ListNode node = new ListNode(val);
        //如果队列为空时
        if(empty()){
            head = node;
            tail = node;
        }else{
            tail.next = node;
            tail = tail.next;
        }
        size++;
    }
实现出队的操作:

public int poll()

{

        if(empty())

{

            return -1;

 }

        //定义一个参数存放头结点的值

        int ret = head.val;

        head = head.next;

        if(head == null){

            tail = null;

 }

        size--;

        return ret;

    }

希望对你的数据结构有帮助……

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值