数据结构(java语言描述)-- 栈的两种简单实现
来源:互联网 发布:mac 强制删除文件夹 编辑:程序博客网 时间:2024/06/05 04:11
首先了解下栈的概念:
栈是限定仅在表头进行插入和删除操作的线性表。有时又叫LIFO(后进先出表)。要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。
"栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
栈模型:
只有栈顶元素是可以访问的。
任何实现表的方法都能实现栈。因为栈操作是常数时间,所以,除非在非常独特的环境下,这是不可能产生任何明显的改进的。
下面给出第一种比较简单的方法,即使用双链表实现栈。
import java.util.*;/** * 链式结构实现栈 * @author Administrator * * @param <E> */public class MyStack<E>{ LinkedList<E> list; public MyStack(){ list = new LinkedList<E>(); } //出栈 public E pop(){ return list.removeLast(); } //入栈 public void push(E o){ list.add(o); } //访问栈顶元素 public E getTop(){ return list.getLast(); } //栈为空 public boolean isEmpty(){ return list.size()==0; } //栈大小 public int size(){ return list.size(); } /** * 测试代码 * @param args */ public static void main(String[] args) { MyStack<String> stack = new MyStack<String>(); stack.push("我是第一入栈的元素"); stack.push("我是第二入栈的元素"); stack.push("我是第三入栈的元素"); System.out.println("栈是否为空:"+stack.isEmpty()); System.out.println("栈顶元素:"+stack.getTop()); System.out.println("第一个出栈:"+stack.pop()); System.out.println("第二个出栈:"+stack.pop()); System.out.println("第三个出栈:"+stack.pop()); System.out.println("栈是否为空:"+stack.isEmpty()); } }
测试结果:
下面给出第二种简单的方法,即使用数组实现栈。
/** * 栈的简单数组实现 * @author lenovo * * @param <E> */public class TestArrStack<E> { private Object[] stack; // 栈的声明 private static final int DEFAULLT_SIZE = 2; // 栈的默认初始大小 private int theOfStack; // 栈顶索引 /** * 构造栈 */ public TestArrStack() { stack = new Object[DEFAULLT_SIZE]; theOfStack = -1; } /** * 构造方法 * * @param theSize * 栈的初始大小 */ public TestArrStack(int theSize) { if (theSize < 0) { throw new IllegalArgumentException(); } stack = new Object[theSize]; theOfStack = -1; } /** * 出栈操作 * * @return 栈顶对象 */ public E pop() { if (!isEmpty()) { E temp = peek(); stack[theOfStack--] = null; return temp; } return null; } /** * 入栈操作 * * @param newVal 等待入栈的对象 * */ public void push(E newVal) { if (isFull()) { Object[] temp = stack; // 如果栈满,则创建空间为当前栈空间两倍的栈 stack = new Object[stack.length * 2]; System.arraycopy(temp, 0, stack, 0, temp.length); } stack[++theOfStack] = newVal; } /** * 查看栈顶对象 * * @return 栈顶对象 */ public E peek() { if (!isEmpty()) { return (E) stack[theOfStack]; } return null; } /** * 查看栈是否为空 * * @return 如果栈为空返回true,否则返回false */ public boolean isEmpty() { return theOfStack == -1; } /** * 查看栈是否满 * * @return 如果栈满返回true,否则返回false */ public boolean isFull() { return theOfStack >= stack.length - 1; } /** * 测试代码 * @param args */ public static void main(String[] args) { TestArrStack<String> sta = new TestArrStack<String>(); sta.push("我是第一入栈的元素"); sta.push("我是第二入栈的元素"); sta.push("我是第三入栈的元素"); System.out.println("栈满?"+sta.isFull()); System.out.println("栈是否为空:"+sta.isEmpty()); System.out.println("栈顶元素:"+sta.peek()); System.out.println("第一个出栈:"+sta.pop()); System.out.println("第二个出栈:"+sta.pop()); System.out.println("第三个出栈:"+sta.pop()); System.out.println("栈满?"+sta.isFull()); System.out.println("栈是否为空:"+sta.isEmpty()); }}
测试结果:
0 0
- 数据结构(java语言描述)-- 栈的两种简单实现
- 数据结构(java语言描述)-- 表的简单数组实现
- 数据结构(java语言描述)-- 队列的循环数组实现
- 数据结构:栈的链式实现(C语言描述)
- 一个简单的矩阵类的实现(参照《数据结构C++语言描述》第五章)
- (数据结构与算法分析 三)------栈的实现(包括链栈和数组实现栈 Java语言描述)
- 数据结构(java语言描述)-- 二叉查找树的链式存储结构的实现
- 数据结构与算法分析(Java语言描述)(28)—— 使用 dfs 求两节点间的路径
- (数据结构与算法分析 四)------数组循环队列的实现( Java语言描述)
- (数据结构与算法分析 五)------二叉查找树的实现( Java语言描述)
- (数据结构与算法分析 六)------散列表的实现( Java语言描述)
- 数据结构与算法分析(Java语言描述)(30)—— 有权图的实现
- 数据结构Map—java描述(2)—HashMap的两种遍历方法
- 两种实现数据结构中的栈(C语言)
- 数据结构C 语言描述——实现栈的基本功能
- 数据结构与算法(Java语言描述)--栈和队列
- [数据结构]栈的C语言简单实现
- 左式堆的简单实现(C语言描述)
- 神奇的开方
- 隐式转换问题
- 蛇形填数
- 购物省钱小助手让您购物更轻松,返利更简单
- javascript动画基础(五)--三角学在动画中的运用(4)
- 数据结构(java语言描述)-- 栈的两种简单实现
- 《编程导论(Java)·7.4.3 堆上的对象》
- hdu 1561 The more, The Better 树形dp+背包
- AppiumDriver升级到2.0.0版本引发的问题--Cannot instantiate the type AppiumDriver
- 【Struts2学习笔记(4)】指定需要Struts 2处理的请求后缀和细说常量定义
- php递增、递减运算的理解
- hdu 3308 LCIS(线段树)
- 探寻C++最快的读取文件的方案
- IT求职