一、栈

栈的定义 
栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。 
(1)通常称插入、删除的这一端为栈顶 (Top),另一端称为栈底 (Bottom)。 
(2)当表中没有元素时称为空栈。 
(3)栈为后进先出(Last In First Out)的线性表,简称为 LIFO 表。 
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中" 
最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部, 
要到最后才能删除。

2、栈的基本运算

(1) 判断栈是否为空 
    boolean isEmpty();      
(2)清空栈 
    void clear();  
(3)栈的长度 
    int length();     
(4)数据入栈 
    boolean push(T data);   
 (5)数据出栈 ,栈中删除
    T pop();     
 (6)数据出栈 ,栈中不删除

T peek();

二、代码编写

1、接口类

  1. package com.lin.stack;
  2. /**
  3. * 功能概要:栈的接口类
  4. *
  5. * @author linbingwen
  6. * @since  2015年8月29日
  7. */
  8. public interface MyStack<T> {
  9. /**
  10. * 判断栈是否为空
  11. * @author linbingwen
  12. * @since  2015年8月29日
  13. * @return
  14. */
  15. boolean isEmpty();
  16. /**
  17. * 清空栈
  18. * @author linbingwen
  19. * @since  2015年8月29日
  20. */
  21. void clear();
  22. /**
  23. * 栈的长度
  24. * @author linbingwen
  25. * @since  2015年8月29日
  26. * @return
  27. */
  28. int length();
  29. /**
  30. * 数据入栈
  31. * @author linbingwen
  32. * @since  2015年8月29日
  33. * @param data
  34. * @return
  35. */
  36. boolean push(T data);
  37. /**
  38. * 数据出栈 ,栈中删除
  39. * @author linbingwen
  40. * @since  2015年8月29日
  41. * @return
  42. */
  43. T pop();
  44. /**
  45. * 数据出栈 ,栈中不删除
  46. * @author linbingwen
  47. * @since  2015年8月29日
  48. * @return
  49. */
  50. T peek();
  51. }

2、数组实现栈

  1. package com.lin.stack;
  2. /**
  3. * 功能概要:数组实现栈
  4. *
  5. * @author linbingwen
  6. * @since  2015年8月29日
  7. */
  8. public class MyArrayStack<T> implements MyStack<T> {
  9. private Object[] objs = new Object[16];
  10. private int size;
  11. @Override
  12. public boolean isEmpty() {
  13. return size == 0;
  14. }
  15. @Override
  16. public void clear() {
  17. for (int i = 0; i < objs.length; i++) {
  18. objs[i] = null;
  19. size--;
  20. }
  21. }
  22. @Override
  23. public int length() {
  24. return size;
  25. }
  26. @Override
  27. public boolean push(T data) {
  28. if(size == (objs.length-1)){
  29. Object[] temp = new Object[objs.length*2];
  30. for (int i = 0; i < objs.length; i++) {
  31. temp[i]=objs[i];
  32. }
  33. objs= temp;
  34. }
  35. objs[size++]=data;
  36. return true;
  37. }
  38. @Override
  39. @SuppressWarnings("unchecked")
  40. public T pop() {
  41. return size == 0?null:(T) objs[(size--)-1];
  42. }
  43. @Override
  44. @SuppressWarnings("unchecked")
  45. public T peek() {
  46. return size == 0?null:(T) objs[size];
  47. }
  48. }

3、链表实现栈

  1. package com.lin.stack;
  2. /**
  3. * 功能概要:
  4. *
  5. * @author linbingwen
  6. * @since  2015年8月29日
  7. */
  8. public class MyListStack<T> implements MyStack<T>{
  9. private int size;
  10. private Node top;
  11. class Node{
  12. T data;
  13. Node pre;
  14. }
  15. @Override
  16. public boolean isEmpty() {
  17. return size == 0;
  18. }
  19. @Override
  20. public void clear() {
  21. top = null;
  22. }
  23. @Override
  24. public int length() {
  25. return size;
  26. }
  27. @Override
  28. public boolean push(T data) {
  29. Node node = new Node();
  30. node.data=data;
  31. if( null == top){
  32. top = node;
  33. }else {
  34. node.pre = top;
  35. top =node;
  36. }
  37. size++;
  38. return true;
  39. }
  40. @Override
  41. public T pop() {
  42. if(size == 0){
  43. return null;
  44. }
  45. T data = top.data;
  46. top = top.pre;
  47. size--;
  48. return data;
  49. }
  50. @Override
  51. public T peek() {
  52. if(size == 0){
  53. return null;
  54. }
  55. T data = top.data;
  56. return data;
  57. }
  58. }

4、测试

  1. package com.lin.stack;
  2. /**
  3. * 功能概要:
  4. *
  5. * @author linbingwen
  6. * @since  2015年8月29日
  7. */
  8. public class StackTest {
  9. /**
  10. * @author linbingwen
  11. * @since  2015年8月29日
  12. * @param args
  13. */
  14. public static void main(String[] args) {
  15. MyStack<Integer> myStack1 = new MyArrayStack<Integer>();
  16. MyStack<Integer> myStack2 = new MyListStack<Integer>();
  17. for(int i =0;i<30;i++){
  18. myStack1.push(i);
  19. myStack2.push(i);
  20. }
  21. System.out.println("数组实现的栈输出如下 ");
  22. for(int j =0;j<30;j++){
  23. System.out.print(myStack1.pop()+"  ");
  24. }
  25. System.out.println();
  26. System.out.println("链表实现的栈输出如下 ");
  27. for(int k =0;k<30;k++){
  28. System.out.print(myStack2.pop()+"  ");
  29. }
  30. }
  31. }

输出结果如下:

或者 看这里:

数组实现的栈输出如下 
29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10  9  8  7  6  5  4  3  2  1  0  
链表实现的栈输出如下 
29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10  9  8  7  6  5  4  3  2  1  0 

http://blog.csdn.net/evankaka/article/details/48088983

Java栈的实例-数组和链表两种方法(转)的更多相关文章

  1. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  2. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  3. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  4. Java执行shell脚本并返回结果两种方法的完整代码

    Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...

  5. DES加密 java与.net可以相互加密解密两种方法

    DES加密 java与.net可以相互加密解密两种方法 https://www.cnblogs.com/DrWang/archive/2011/03/30/2000124.html sun.misc. ...

  6. PHP中数组合并的两种方法及区别介绍

    PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...

  7. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  8. 将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  9. 使用 Eclipse 可视化插件 windowbuilder 进行Java GUI开发(插件安装的两种方法)

    对于Java GUI开发 其实最方便的方法是用插件制作,当然先了解完代码原理是最好的. eclispe安装windowbuilder有两种方式,一种是离线安装,一种是在线安装. 一.第一种在线安装: ...

随机推荐

  1. OCA读书笔记(15) - 执行数据库备份

    物理备份 -- 数据文件,控制文件,日志文件,参数文件 数据库备份 冷备 -- 归档和非归档均可以 什么时候必须用冷备?1. 数据库的模式为非归档的2. 用于现场保护 冷备的过程:1. 首先查看备份文 ...

  2. SQL Server Database 维护计划创建一个完整的备份策略

     SQL Server维护计划Maintenance Plan这是一个非常有用的维护工具,能够完成大部分的数据库维护任务,通过这些功能包.您可以省略大量的编码时间. 介绍的不是非常多,特此补上一篇 ...

  3. shu_1241 邮局位置问题

    http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=5 分析: 由于题目中的距离是折线距离,所以能够分别考虑两个方向.又x方 ...

  4. android视频库Vitamio

    之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问 ...

  5. 【Unity 3D】学习笔记三十七:物理引擎——碰撞与休眠

    碰撞与休眠 上一篇笔记说过,当给予游戏对象刚体这个组件以后,那么这个组件将存在碰撞的可能性.一旦刚体開始运动,那么系统方法便会监视刚体的碰撞状态.一般刚体的碰撞分为三种:进入碰撞,碰撞中,和碰撞结束. ...

  6. c++程序猿经典面试题

    1.请问i的值会输出什么? #include"iostream.h" int i=1; void main() { int i=i; cout<<i<<en ...

  7. 【Python】Coding the Matrix:Week 5 Perspective Lab

    这个Lab的内容光是说明就有7页之巨,我反复看了很久才看懂一点点,Lab主要完成的是从不同坐标系表示之间变换的方法. 原始的图片,从Camera basis的表示转换成WhiteBoard basis ...

  8. bzoj 3519: [Zjoi2014] 消棋子 题解

    [序言]在大家怀疑的眼光下,我做了一个中午和半个下午.调了一个晚上的题目总算A了! [原题] 消棋子是一个有趣的游戏.游戏在一个r * c的棋盘上进行.棋盘的每一个格 子.要么是空,要么是一种颜色的棋 ...

  9. SE 2014年5月9日

    两企业接入到 Internet(A公司和B公司),企业内部的用户及服务器均能够访问到 Internet. 2. A公司规模较大,采用了接入层/汇聚层/核心层的划分模式,接入层划分了多vLan(如图), ...

  10. C#应用Newtonsoft.Json.dll,控制json的时间格式

    原文:C#应用Newtonsoft.Json.dll,控制json的时间格式 var aIsoDateTimeConverter = new IsoDateTimeConverter();aIsoDa ...