栈(Stack)是一种后进先出的数据结构(LIFO:last in first out),只允许访问栈中的第一个数据项:即最后插入的数据项。移除这个数据项之后,才能看到第二个数据项,以此类推。

往栈中存入数据称之为压栈(push),移除数据称之为弹栈(pop),此外通常还提供查看栈顶元素的peek方法,此方法可以可以栈顶元素的值,但是并不会将其移除

java.util.Stack就是JDK提供的一种对栈的实现,这个实现是基于数组的,由于栈非常简单,我们没有必须要分析源码,直接按照以下方法提供一个相同的自己的实现,此外,我们也可以基于链表来实现一个栈

基于数组的栈的实现

关于基于数组的栈的实现,只有一点值得注意的地方,其是LIFO,但是我们在使用数组的时候,并不需要每次都将元素插入数组的第一个位置,然后将之前的所有元素后移一个位置,只要用一个变量记住最后一个添加的元素的位置即可,当弹栈时,直接返回这个位置上的数字即可public class SimpleArrayStack {

private Object[] array = null;

private int size = 0;

private static final int DEFAULR_INITIAL_SIZE = 10;

private int capacity = 0;

public SimpleArrayStack() {

this(DEFAULR_INITIAL_SIZE );

}

public SimpleArrayStack(int initial_size) {

super();

this.capacity = initial_size;

array = new Object[initial_size];

}

@SuppressWarnings("unchecked" )

public T pop() {

if (size

throw new IllegalStateException("no more elements");

}

T result = (T) array [--size];

array[size ] = null;

return result ;

}

@SuppressWarnings("unchecked" )

public T peek() {

if (size

throw new IllegalStateException("no more elements");

}

return (T) array [size - 1];

}

public void push(T e) {

int index = size++;

if (index > capacity) { // 扩容

int new_capacity = capacity + capacity >> 1;

if (new_capacity <= 0) {

new_capacity = Integer.MAX_VALUE;

}

array = Arrays.copyOf( array, new_capacity );

}

array[index ] = e;

}

public int getSize() {

return size ;

}

}

测试代码public class SimpleArrayStackTest {

public static void main(String[] args) {

SimpleArrayStack simpleStack=new SimpleArrayStack();

System. out.print("push:\t" );

for (int i = 0; i

simpleStack.push(i );

System. out.print(i +"\t" );

}

System. out.print("\npop:\t" );

while (simpleStack.getSize()>0){

System. out.print(simpleStack .pop()+"\t");

}

}

}

运行程序输出

push:0123456789

pop:9876543210

可以看到数据都是按照和插入顺序相反的方式弹出来了

基于链表的栈的实现

基于链表的Stack尤为简单,我们可以使用上一节编写SingleLinkList来实现,实际上就是一种委派,并把我们不想提供的方法给屏蔽,这可能没有什么技术含量,但是读者意识到了,一个数据结构可以在另外一个数据结构的基础上编写public class SimpleLinkedListStack {

private SingleLinkList singleLinkList =new SingleLinkList();

public void push(T t){

singleLinkList.addFirst(t);

}

public T pop(){

return singleLinkList.removeFisrt();

}

public T peek(){

return singleLinkList.getFirst();

}

public int getSize(){

return singleLinkList.size();

}

}

java栈顶元素_栈(Stack)相关推荐

  1. java栈顶元素_栈在Java类库中的实现

    栈是一种后进先出的数据结构.在它之上,主要有三种操作: (1)判断栈是否为空--empty(): (2)在栈顶添加一个元素--push(E): (3)删除并返回栈顶元素--pop(). 在Java类库 ...

  2. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  3. Stack:删除并返回栈顶元素?

    在C++中,stack提供了删除栈顶元素的算法 stack<int>stk; stk.pop(); 但是有时候,我们希望在删除的同时能够知道这个栈顶元素是什么,而pop()是不能返回栈顶元 ...

  4. 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素

    栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...

  5. 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码

    C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...

  6. java栈和队列_栈和队列的面试题Java

    栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...

  7. C++栈的初始化,入栈,出栈,获取栈顶元素等操作

    栈的一些性质: 1.栈为空不可以出栈 2.栈顶元素先出 3.新元素插入栈顶 栈的初始化: #include<iostream> #include<string> using n ...

  8. C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈

    /********************************引入头文件**************************************************/ #include&l ...

  9. 指针实现入栈、出栈、取栈顶元素

    #include<stdio.h> #define MAXSIZE 100typedef struct{int *base;int *top;int stacksize; }SqStack ...

最新文章

  1. monkey测试_用 Instrumentation 改良 Monkey 工具实战
  2. 数据库altert日志中的GTX提示
  3. 数字图像处理 中值滤波 MATLAB实验
  4. ERP通用附件管理功能设计与实现
  5. node-amqp 使用fanout发布订阅rabbitmq消息
  6. android json 解析 arraylist,android – 将ArrayList转换为JSONArray
  7. npm下载安装 nodejs下载安装
  8. 计算机论文英语单词,英语单词
  9. 44个“区块链+AI”应用场景分析, 你觉得还能更全吗?
  10. Mac 苹果电脑创建一个新的管理员账号
  11. 数组常用操作。以逗号隔开、以逗号+单引号隔开、转List等
  12. Common Lisp 超规范(译文):3. 编译和求值
  13. 蛇形填数【附重点步骤详细注释】
  14. Android App包瘦身优化
  15. unix/linux io监控
  16. keep-alive:
  17. openCV简易人脸考勤
  18. macbook pro的漏电
  19. java毕业设计家庭理财管理系统mybatis+源码+调试部署+系统+数据库+lw
  20. word中存储矢量图,word转为PDF时矢量图不失真。以及Visio图片放入word后有大量空白

热门文章

  1. 离别海润光伏:杨怀进的“轮回怪圈”
  2. DBMS_STATS常用方法(收集oracle信息)
  3. java多线程(二)——锁机制synchronized(同步方法)
  4. mybatis报-因为 accessExternalDTD 属性设置的限制导致不允许 http 访问
  5. 自建服务器调试,Mac简单实现服务器搭建(本地)与iOS调试
  6. html 前端传数据流,jquery – 使用Node.js流式传输数据
  7. django 按钮的样式_Python学习第五十六天记录打call:Django视图
  8. Oracle存在gap,发现gap及解决
  9. java图片上传并解析_java的图片上传详解
  10. 1.3_bubble_sort_冒泡排序