表,栈,队列(二)

栈ADT

栈是限制插入与删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶点。对栈的基本操作有push和pop,前者相当于插入,后者则是删除最后插入的元素。最后插入的元素可以用top查看,栈也叫LIFO(后进先出表)

栈的实现

栈有两种实现,一种是链表实现,就是使用单链表实现,还有一种是数组实现。栈的数组实现的一些操作不仅以常数时间运行,而且是以非常快的常数时间运行。

栈的应用

平衡符号

编译器检查程序的语法错误,比如左括号是否缺少相印的有括号,可以用栈很容易的检测出来。算法如下
做一个空栈,读入字符知道文件结尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错,否则,将栈元素弹出。如果弹出的元素不匹配,则报错。在文件结尾,如果栈非空,则报错。

后缀表达式

对于表达式,有一种记法叫做后缀表达式或逆波兰式。用栈算表达式的值可以很容易的求出来。算法如下
建立空栈,如果是数字则入栈,如果遇到运算符,则弹出两个数计算,再把值推入栈中。最后在栈中的值就是答案。

中缀到后缀的转换

表达式一般遇见的是中缀表达式,而为了方便计算,可以用栈准换为后缀表达式。算法如下
如果遇到操作数,则立即输出,若遇到操作符号时,若栈空,则入栈,若栈元素存在优先级比自己高或者和自己相同优先级的操作符,则出栈输出,再入栈。若有括号的话,遇见左括号,入栈,遇见右括号,一直出栈直到推出左括号。

队列ADT

像栈一样,队列也是表,不同的是,使用队列时插入在一端进行而删除则在另一端进行。队列的基本操作有入队,出对。

队列的实现

队列有数组实现和链表实现。数组实现保留一个数组theArray和位置对头front,队尾back。
当入队时,back增1,出队时,front增1。这样有潜在的一个问题,就是假设数组长度为10,经过十次入队的时候,似乎队列已经满了,无法在插入,但是因为若干元素出队,导致有的位置时空的,却不能插入。
有一个解决办法就是循环数组,只要front与back到达数组的尾端,它就又绕道开头,这样就可以循环使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值