数据结构-栈

一、介绍

1.1 栈是什么结构

像一摞叠放的盘子,放牌子的时候只能将盘子放在最上面,取盘子的时候只能先取最上面的盘子。**后进先出,先进后出,**这就是典型的栈结构。
在这里插入图片描述

1.2 栈带给我们的只有限制,有了数组和链表为啥还需要栈?

  1. 功能上来说,数组、链表完全可以替代栈,但是越灵活越自由,代表着更容易出错。
  2. 当某个数据集合只涉及在一端进行插入和删除,并且满足后进先出,先进后出时就应该首选栈作为数据结构。

二、栈的实现

  1. 数组和链表,是基础的数据结构,其他的数据结构也可以由它们来实现。
  2. 由数组实现的栈称为顺序栈
  3. 由链表实现的称为链式栈

2.1 顺序栈代码示例

//定义一个栈结构
public class ArrayStack{
    //数组结构
    private String[] items;
    //栈元素个数
    private int count;
    //栈大小
    private int n;

    //构造方法
	public ArrayStack(int n){
        this.item=new String[n];
        this.count=0;
        this.n=n;
    }

    //入栈方法
    public boolean push (){
        if(count==n){
            return false; //满了
        }
        item[count]=item;
        count++;
        return true;
    }

    //出栈方法
    public String pop (){
        if(count==0){
            return null; //空的
        }
        String temp=item[count-1];
        count--;
        return temp;
    }
}

2.2 入栈出栈复杂度

时间复杂度:入栈出栈,都只涉及栈顶元素,所以时间复杂度是O(1)
空间复杂度:只用到了一两个临时变量,所以空间复杂度是O(1)

三、栈的应用

3.1 栈在函数调用中的应用

在程序执行时,每次调用一个新的方法编译器会将函数的临时变量封装为栈帧入栈,执行结束返回后再出栈。

3.2 栈在表达式求值中的应用

对于一个包含不同优先级运算符的表达式来说,编译器就是通过两个栈来对其进行求值。
例如,计算3+5*8-6 其计算过程如下。

  1. 操作数3 入栈
  2. 运算符+ 入栈
  3. 操作数5 入栈
  4. 运算符* 入栈
  5. 操作数8 入栈
  6. 运算符 - 尝试入栈,发现优先级低于运算符栈顶元素 “*”
    1. 取出操作数两个元素和栈顶元素进行运算,运算结果进入操作数栈
    2. 运算符 - 再次尝试入栈 发现优先级等于栈顶元素 “+”
    3. 再出取出操作数两个元素和 “+” 进行运算结果入栈
    4. 至此操作符栈空, “-” 入栈
  7. 6 入栈,开始计算结果。

3.3 栈用于括号匹配检查

如果表达式存在三种括号,()、[]、{} 如何检查括号格式的正确性呢?

  1. 使用一个栈,来保存左括号,从左到右扫描表达式,遇到左括号则入栈
  2. 遇到右括号,则栈顶取出一个左括号与其匹配
  3. 如果中途匹配括号失败,或者扫描结束栈不为空,则说明表达式格式不正确。

3.4 浏览器利用栈实现前进后退

存在两个栈,一个保存前进的历史页面一个保存后退的历史页面

posted @   青花石  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示