java数据结构 栈的概念及其应用

1.栈的定义

  栈是一种先进后出的线性存储结构,先进先出就是队列结构。
  栈(stack)是限制插入和删除只能在一个位置上进行的线性表,该位置是表的末端,叫作栈的顶(top)。对栈的基本操作有 push(进栈)和 pop(出栈),前者相当于插入,后者则是删除最后插入的元素。
栈的基础语法结构:

Stack  st = new Stack(); 
       st . 栈的方法

1.1 栈的主要特性
  (1)栈中的数据元素遵守”先进后出”(First In Last Out)的原则,简称 FILO 结构。
  (2)限定只能在栈顶进行插入和删除操作

功能上的差异
功能上数组或链表确实可以代替栈,特定的数据结构是对特定场景的抽象,并且数组或链表暴露了太多的操作接口,操作上的确灵活自由,但是使用上比较不可控,自然比较容易出错。

栈的相关概念(Stack方法)
1)栈顶(top)与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
2)压栈(push)栈的插入操作,叫做进栈,也称压栈、入栈。 Integer
3)弹栈(pop):栈的删除操作,也叫做出栈。 Integer
4)empty( ) 判定栈是否为空 boolean
5)peek( ) 获取栈顶元素 Integer
6)search( num ) 判断元素 num 是否在栈中,如果在返回1,不在返回 -1。
7)createStack(info.length()) 创建与字符串长度一致栈

注意:
   pop()和peek()的区别。pop()会弹出栈顶元素并返回栈顶的值,peek()只是获取栈顶的值,但是并不会把元素从栈顶弹出来。

2.复杂度分析

栈的两种实现方案,对栈的复杂度分析:
   (1)动态栈(链表):也叫链式栈。
由于都是操作指定位置的结点,所以其进栈和出栈的时间复杂度都是 O(1)。
  (2)静态栈(数组):也叫顺序栈。
一般来说,如果用数组实现的栈,其大小是固定的,不支持动态扩容。对于这种固定大小的栈结构,进栈和出栈的时间复杂度也都是 O(1)。
  在少数场景中,需要利用数据实现动态扩容的栈结构,出栈的时间复杂度同样 O(1) ,只有执行 n 次入栈后需要扩容时,最坏时间复杂度才是 O(n),如果使用摊还分析法,其均摊时间复杂度仍是 O(1)。

3.栈的相关应用

  应用包括归的调用和返回、二叉树和森林的遍历、调用子程序及从子程序返回、表达式的转换和求值、CPU 的中断处理等等。

  (1)表达式求值
     编译器通过两个栈实现表达式的求值。
     1)操作数栈。我们从左向右遍历表达式,当遇到数字,我们就直接压入操作数栈;
    2)运算符栈。当遇到运算符,就与运算符栈的栈顶元素进行比较。如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取 2 个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较。

  (2)括号匹配
     编译器语法校验,如 [] () {} 必须成对匹配,并且它们可以任意嵌套。同样也可以借助栈来检查表达式中的括号是否匹配。

  (3)函数调用
    操作系统给每个线程分配了一块独立的内存空间,这块内存被组织成“栈”这种结构, 用来存储函数调用时的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值