数据结构之栈(使用、自实现、应用及栈与虚拟机栈和栈帧的区别)

简介: 数据结构之栈(使用、自实现、应用及栈与虚拟机栈和栈帧的区别)

一、栈是什么?


栈是一种特殊的线性表,只能在一端进行操作


往栈中添加元素的操作,一般叫做push,入栈


从栈中移除元素的操作,一般叫做pop,出栈(只能移除栈顶元素,也叫做弹出栈顶元素)


遵循先进后出,后进先出的原则


1667910011023.jpg


注意:这里所说的栈和栈空间是两个不同的概念,栈是一种数据结构,用来组织数据和存放数据的,而栈空间是内存的一种,是一种内存空间。


二、栈的接口设计


栈可以直接在链表的基础上去实现,运用组合的方式,让ArrayList成为栈的一部分,然后在此基础上实现栈的功能。


◼ int size(); // 元素的数量
◼ boolean isEmpty(); // 是否为空
◼ void push(E element ); // 入栈
◼ E pop(); // 出栈
◼ E top(); // 获取栈顶元素
◼  void clear(); // 清空
public class Stack<E> {
  private List<E> list = new ArrayList<>();
  public void clear() {
  list.clear();
  }
  public int size() {
  return list.size();
  }
  public boolean isEmpty() {
  return list.isEmpty();
  }
  public void push(E element) {
  list.add(element);
  }
  public E pop() {
  return list.remove(list.size() - 1);
  }
  public E top() {
  return list.get(list.size() - 1);
  }
}


三、栈的常用方法


方法 功能

Stack()

构造一个空的栈

E push(E e)

e入栈,并返回e

E pop()

将栈顶元素出栈并返回

E peek()

获取栈顶元素

int size()

获取栈中有效元素个数

boolean empty()

检测栈是否为空


四、栈的底层是什么?


通过观察源码,我们可以发现,Stack继承了Vector。

1667910112816.jpg

1667910124503.jpg

Vector是用数组实现的,所以栈的底层是数组。


五、栈的自实现(数组、单链表、双向链表)


一:用数组自实现:


public class MyStack {
    int[] elem;
    int usesize;
    static final int DEFAULT_SIZE = 10;
    public MyStack(){
        this.elem = new int[DEFAULT_SIZE];
    }
    public int push(int val){
        if (isFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        elem[usesize] = val;
        usesize++;
        return val;
    }
    public boolean isFull(){
        return usesize == elem.length;
    }
    public int pop(){
        if (empty()){
            throw new MyEmptyStackException("栈为空!");
        }
        return elem[--usesize];
    }
    public boolean empty(){
        return usesize == 0;
    }
    public int peek(){
        if (empty()){
            throw new MyEmptyStackException("栈为空!");
        }
        return elem[usesize-1];
    }
}

二:用单链表的也可以实现,其中入栈用头插,出栈也是在头部,时间复杂度为O(1)。当然双向链表也可以实现栈,而且头尾都可以作为出栈和入栈。


六、栈的应用(浏览器的前进后退、根据逆波兰表达式求值)


浏览器的前进和后退其实就是用到了栈。


当我们连续输入三个网站,比如,baidu.com,taobao.com,qq.com

1667910158658.jpg



这个时候这三个网站可以前进和后退,其实这里是用到了两个栈。

1667910169958.jpg

1667910182914.jpg

但是当我们后退到中间位置时,即没有在最后进来的网站的时候,这个时候我们再次输入bilibili.com的时候,在之前位置的后面的网站全都清空了,把新加进来的网站做为最新的最后的网站。

1667910194986.jpg

根据逆波兰表达式求值:


中缀表达式转后缀表达式(逆波兰式):


1667910208114.jpg


用栈实现计算后缀表达式:1 2 3 * + 4 5 * 6 + 7 * +


方法:遇到数字入栈,遇到运算符出栈顶的两个元素,其中弹出的第一个是右操作数,第二个是左操作数。


1667910220937.jpg


七、栈、虚拟机栈、栈帧有什么区别呢?

栈是一种先进后出的数据结构。


虚拟机栈是JVM的一块内存空间。


栈帧是在函数的调用过程中,在java虚拟机栈上开辟的一块内存。


相关文章
|
3月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
308 86
|
5月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
176 1
|
6月前
|
存储 弹性计算 运维
还在死磕虚拟机?应用为中心的IT管理新范式,可能被你忽略了!
在企业信息化的征途中,虚拟机(VM)技术无疑扮演过举足轻重的角色。它曾有效地解决了物理服务器资源利用率低下、环境隔离困难等一系列棘手问题,并迅速成为数据中心和企业IT基础设施的**标配**。然而,时移世易,随着业务迭代节奏的空前加快、应用架构(如微服务、云原生)的日趋复杂,以及企业对降本增效近乎极致的追求,我们发现,单纯依赖虚拟机进行应用管理,渐渐显露出其局限性,甚至成为制约效率的瓶颈。
还在死磕虚拟机?应用为中心的IT管理新范式,可能被你忽略了!
|
5月前
|
存储 监控 算法
公司员工泄密防护体系中跳表数据结构及其 Go 语言算法的应用研究
在数字化办公中,企业面临员工泄密风险。本文探讨使用跳表(Skip List)数据结构优化泄密防护系统,提升敏感数据监测效率。跳表以其高效的动态数据处理能力,为企业信息安全管理提供了可靠技术支持。
144 0
|
6月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
138 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
10月前
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
254 11
|
9月前
|
编解码 监控 虚拟化
Hyper分辨率优化技术,怎么使得虚拟机中的图形应用能够以更高的清晰度呈现
Hyper分辨率优化技术通过增强虚拟机的图形处理能力,显著提升图像清晰度和视觉体验,适用于图形设计、视频编辑等场景。该技术依赖于虚拟机的硬件配置、显卡驱动及显示设置,确保高分辨率内容的最佳呈现。使用时需合理设置分辨率,定期更新驱动并监控性能,以实现最佳效果。
|
10月前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。

热门文章

最新文章