栈的两种实现方法

这篇博客介绍了如何使用数组和链表两种方式来实现栈数据结构。栈是一种后进先出(LIFO)的数据结构,文章通过Java代码详细展示了在数组达到容量限制时如何动态扩充以及链表中如何进行元素的添加和删除。同时,提供了主函数来演示这些操作的实际运行效果。
摘要由CSDN通过智能技术生成

栈是一种特殊的线性表,采用后进先出的模式。

数组方法

定义一个固定长度的数组,每次push前判断top是否等于size,当等于时说明数组内部已经填满,应进行扩充,否则直接将数据填入到top位置,top++。
代码如下:

class stack1{
    //采用数组方式
    Object[] stack;
    int top;
    int size;
    public void init_stack1(){
        //初始化栈的大小
        size=10;
        stack=new Object[size];
        top=0;
    }
    public void push_stack1(Object data){
        if(top>=size){
            //top=size时说明栈内已填满,栈内位置不够,进行扩充,每次扩充一倍
            size=size*2;
            stack= Arrays.copyOf(stack,size);
        }
            stack[top]=data;
            top++;
        System.out.println(stack[top-1]+"添加成功");
    }
    public void pop_stack1(){

        if(top!=0){
            //说明栈内有数据,可以进行弹栈
           Object t=stack[top-1];
            stack[top-1]=null;
            top--;
           System.out.println(t+"删除成功");
        }

    }
   public void print_stack1(){
        //将栈内元素全部清空

        while (top>0){
            System.out.print(stack[top-1]+",");
            stack[top-1]=null;
            top--;
        }

   }
}

链表方法

链表采用动态扩充的方式,push时将数据添加到top指针指向的结点,创建一个新节点,top指针移动。pop时将top指针的前结点指向null,将top结点释放,top指针移动。
代码如下:
class stack2{

    //采用链表的方式
    DNode node;
    DNode top;
    DNode base;
    int size;
    public void init_stack2(){
        node=new DNode();
        top=new DNode();
        base=new DNode();
        node.setData(null);
        node.next=null;
        top.next=node;
        base.next=node;
    }
    public void push_stack2(Object data){
            top.next.setData(data);
        System.out.println(top.next.getData()+"添加成功!");

        node=new DNode();

        node.next=null;
        node.pre=top.next;
        top.next.next=node;

        top.next=node;
        System.out.println("此时的栈顶数据为:"+top.next.getData());
    }
    public void pop_stack2(){
        Object t=top.next.pre.getData();
        //将栈顶结点的前结点指向null
        top.next.pre.next=null;
        //将栈顶结点释放
        top.next.free();
        //栈顶指针向前移
        top.next=top.next.pre;
        System.out.println(t+"删除成功");

    }
    public void print_stack2(){
      //将栈内数据全部弹出
        while (top.next.pre!=base.next) {
            System.out.print(top.next.pre.getData() + ",");
            top.next = top.next.pre;
        }
        System.out.print(base.next.getData());
    }

}

主函数:

package List;

import java.util.Arrays;

public class stack {

    public static void main(String[] args){
        stack1 stack1=new stack1();
        stack1.init_stack1();
        stack1.push_stack1('a');
        stack1.push_stack1('b');
        stack1.pop_stack1();
        stack1.push_stack1('c');
        stack1.print_stack1();
        System.out.println("------------------------------");
        stack2 stack2=new stack2();
        stack2.init_stack2();
        stack2.push_stack2('a');
        stack2.push_stack2('b');
        stack2.pop_stack2();
        stack2.push_stack2('c');
        stack2.print_stack2();
    }
}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值