Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90113
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1007
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 14:50
文章分类

全部博文(81)

文章存档

2014年(21)

2013年(60)

我的朋友

分类: IT业界

2013-11-20 14:53:43

  1.1本章学习目标

  什么是栈

  栈的特点

  栈的接口定义

  1.2什么是栈:栈的元素是按照后进先出LIFO:Last in First Out(也叫先进后出),其元素的添加和删除都是在同一端进行的,也就是说放在栈中的最后一个元素,将是第一个被移出的元素。换句话说,栈中的元素是以他们防止到栈中的相反的顺序来移除的。允许进行插入、删除的一端叫栈顶,另一段称为栈底。

  栈的示意图如下:

  图1.2.1

  上图对应的是四个元素的入栈,顺序依次为A、B、C、D.可能会碰到的面试题如下:

  ①设有4个元素a、b、c、d进栈,给出它们所有可能的出栈次序。

  答:所有可能的出栈次序如下:
       sducc1120

  abcd abdc acbd acdb

  adcb bacd badc bcad

  bcda bdca cbad cbda

  cdba dcba

  ②已知一个栈的进栈序列是1,2,3,…,n,其输出序列是p1,p2,…,pn,若p1=n,则pi的值 。

  (A) i (B) n-i

  (C) n-i+1 (D) 不确定

  答:当p1=n时,输出序列必是n,n-1,…,3,2,1,则有:

  p2=n-1,

  p3=n-2,

  …,

  pn=1

  推断出pi=n-i+1,所以本题答案为C。

  1.3栈的使用

  栈的基本使用就是用于颠倒顺序,比如一个取消操作。例如文字处理程序中的取消操作,通常就是用栈来实现的,当我们对某个文档进行增加、修改、删除等操作时,文字处理程序通过把每个操作的表示压入栈(入栈)来跟踪这些操作,如果需要取消一个操作,文字处理程序会从栈中弹出最近执行的操作并退回到上一个操作,如果要再次进行取消,则再从栈中弹出另一个元素,一以此类推,来实现撤销的操作。 sducc1120

  根据约定的术语,栈的压入称为push,出栈称为pop,查看peek。

  表1-3-1栈的操作操作说明

  push添加一个元素到栈的顶部(入栈)

  pop从栈的顶部移除一个元素(出栈)

  peek查看栈顶部的元素

  isEmpty判断栈是否为空

  size栈的大小(栈内元素个数)

  说明:如果pop、peek的操作作用于空栈,则会抛出异常信息,同样栈满时,也应捕获这种异常信息.

  细心的读者可能会发现,有没有这样一种操作:它能允许我们进入栈中去修改、删除该栈中的元素呢?答案是否定的,因为栈只能在一端进行操作(栈顶).如果需要访问集合中间或底部的元素,就不适合使用栈作为数据结构了。 sducc1120

  1.4栈的接口定义

  栈接口被定义为StackADT,表示作用于泛型T,在该接口的方法中,各个参数的返回值类型均使用泛型T来表述,在实现该接口时,将会用某种数据类型来替换泛型T。

  public interface StackADT { /** * 往栈顶添加一个元素 * */ public void push(T element); /** * 从栈顶移除一个元素,并返回该元素 * */ public T pop(); /** * 返回但不移除栈顶元素 * */ public T peek(); /** * 判断是否为空 * */ public boolean isEmpty(); /** * 返回栈大小 * */ public int size(); }

阅读(205) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~