基于数组和链表两种方式实现栈
来源:互联网 发布:易语言微信机器人源码 编辑:程序博客网 时间:2024/06/06 10:01
栈是一种先进后出的数据结构,在实际编程栈有很广泛的用处,Java栈已经帮我们实现好了stack类。
实现栈的两种方式,基于数组实现和基于链表实现。
1.stack接口
public interface StackADT {//入栈操作public void push(Object element);//出栈操作public Object pop();//判断是否为空public boolean isEmpty();//得到当前栈的大小public int size();//返回栈顶对象的引用public Object peek();//转化为字符串public String toString();}
//基于数组实现栈stack 类栈维护一个数组、一个top指针即可public class ArrayStack implements StackADT {//用数组来存储压入栈的对象private Object[] contents;//标记当前栈的栈顶元素private int top;//默认数组大小private static int SIZE=10;//构造函数初始化public ArrayStack() {contents=new Object[SIZE];top=0;}//基于数组实现,必须有一个扩容方法,当栈不够大时,进行扩容//扩容的本质就是新建一个两倍大的数组,之前的数组丢掉不要public void expand(){//每次将当前size扩大为两倍Object[] larger=new Object[size()*2];for(int index=0;index<top;index++)larger[index]=contents[index];//将指向数组的引用指向新的扩容后的数组,旧的数组没有引用指向就会被垃圾回收器回收contents=larger;}@Overridepublic void push(Object element) {if(top==contents.length)expand();contents[top]=element;top++;}@Overridepublic Object pop() {if(isEmpty()){System.out.println("stack is empty");System.exit(1);}Object result = contents[top-1]; contents[top-1] = null;//出栈 即把栈顶元素的引用置为null,实际上元素对象还在,被另一个result引用所指 top--; return result; }@Overridepublic boolean isEmpty() {return (size()==0);}@Overridepublic int size() {return top;}@Overridepublic Object peek() {Object result; if(isEmpty()) result = null; else result = contents[top-1]; return result;}public static void main(String[] args) {ArrayStack stack = new ArrayStack(); System.out.println("将0到24依次压栈,然后连续10次出栈"); for(int i = 0;i < 25;i++) stack.push(i); for(int i = 0;i < 10;i++) stack.pop(); System.out.println("栈的大小为: " + stack.size()); System.out.println("栈为空吗?: " + stack.isEmpty()); System.out.println("栈顶元素为: " + stack.peek());}}
//基于链表实现栈,也就是以节点的形式存储栈,从头节点往外取出数据,这样好处理public class LinkedStack implements StackADT {// 链表节点类,内部类实现,包含数据域和指针域class Node {int data; // 数据域Node next;// 指针域public Node(int data) {this.data = data;}} private Node top;private int count;public LinkedStack(){ top = null; count = 0; }@Overridepublic void push(Object element) {Node node=new Node((Integer)element);//倒序构造链表,最先入栈的是链表尾部,然后最后入栈的是链表头部,这样指针指向关系容易实现,虽然逻辑不好理解//因为我们的理解一般是从头部开始构造节点,而从尾部开始构造节点比较抽象node.next=top;//指向的是头结点top=node;count++;}@Overridepublic Object pop() {if(isEmpty()){ System.out.println("stack is empty!"); System.exit(1); }Object result=top.data;top=top.next;count--;return result;}@Overridepublic boolean isEmpty() {return (size()==0);}@Overridepublic int size() {return count;}@Overridepublic Object peek() { Object result = top.data; return result;}}
0 0
- 基于数组和链表两种方式实现栈
- 用数组和链表两种方式实现栈
- 基于数组和节点方式的队列的实现
- java实现栈(数组和链表两种实现方式)
- Java的栈实现(数组、链表两种方式)
- 基于数组和链表的栈实现
- 栈的两种实现方式:数组和链表
- 基于数组的栈实现
- java实现栈(数组方式)
- 基于数组和基于链表线性表C++实现
- java 基于数组的栈的实现
- 基于数组实现双向栈 c++
- (四)基于数组的栈的实现
- 简单栈的实现(基于数组)
- C语言实现栈(基于数组)
- 栈的原理以及实现(基于数组)
- C语言实现栈(基于数组)
- Java实现基于数组的顺序栈
- C语言内存分布之数据段
- Caffe + Ubuntu 16.04 + GTK780 + GIGABYTE-uefi DualBIOS 配置
- c# 添加图片水印,可以指定水印位置+生成缩略图
- 记最近ie浏览器的兼容
- nltk-构建和使用语料库-可用于小说的推荐-完整实例
- 基于数组和链表两种方式实现栈
- Drawable系列(一)——BitmapDrawable的属性和使用介绍
- 大型程序的结构(二)【配置选项config.py】
- EditPlus更改背景颜色
- Java中的Random()函数
- 最大公约数和最小公倍数
- OpenNI2关于不能显示depth image问题
- Qt加载QSS文件
- QML简单动画Behavior代替复杂代码