栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为先进后出表。
import java.util.Arrays;
/**
* <h2>Stack</h2>仿照java的 Stack类实现的
* <dl>
* <br>
* <dt>职能概要 <br>
* <dd> 用一个数组来模拟栈的操作,当栈已满时,把大小扩大为原来的二倍 <br>
* <dd>
* </dl>
*
* @author Bruce
* @date Sep 7, 2011
* @version 1.0
*/
class Stack<E> {
private Object[] elementData;
private int elementCount;
private static final int INITIAL_CAPACITY = 1;
public Stack() {
super();
elementData = new Object[INITIAL_CAPACITY];
elementCount = 0;
}
/**
* 入栈操作
* @param element
*/
public void push(E element) {
int oldCapacity = elementData.length;
int newCapacity;
if (elementCount + 1 > oldCapacity) {
newCapacity = oldCapacity * 2;
if (newCapacity < elementCount + 1) {
newCapacity = elementCount + 1;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
elementData[elementCount++] = element;
}
/**
* 出栈操作,返回栈顶元素;并且将其移除栈
* @return object
*/
public Object pop() {
Object temp = elementData[elementCount - 1];
if (elementCount > 0) {
elementData = Arrays.copyOf(elementData, --elementCount);
}
return temp;
}
/**
* 返回栈顶元素
* @return
*/
public Object peek() {
if (elementCount > 0) {
return elementData[elementCount - 1];
} else
return null;
}
public boolean isEmpty() {
return elementCount == 0;
}
public Object[] getElementData() {
return elementData;
}
}
/**
* 测试类
* @author Bruce
* @date Sep 7, 2011
* @version
*/
public class SimulationStack {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(4);
stack.push(0);
stack.push(1);
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}
分享到:
相关推荐
数组模拟栈是计算机科学中数据结构的一个基础概念,主要用于实现后进先出(LIFO)的数据访问模式。在本资源“数组模拟栈.rar”中,包含的代码是用C语言实现的,它允许我们理解如何利用数组来创建一个功能完备的栈。 ...
数组模拟栈是数据结构中的一个基础概念,它利用数组来实现栈这种线性数据结构。在计算机科学中,栈是一种后进先出(LIFO,Last In First Out)的数据结构,通常用于临时存储和处理数据。数组作为一种基本的内存分配...
在C++中,我们可以通过定义一个固定大小的数组来模拟栈的数据存储。例如,我们可以定义一个大小为10的整数数组来存储栈元素: ```cpp int stackArray[10]; ``` 初始化时,我们将栈顶指针(top)设置为-1,...
1. 猴子选大王问题:通过数组模拟报数过程,找出最后剩下的猴子的位置。 2. 狐狸捉兔子问题:兔子利用队列的特性来隐藏位置,使得狐狸无法预测其位置。 3. 约瑟夫问题:利用栈来实现循环报数,找出按照特定规则出列...
在数组模拟的树中,先序遍历需要通过数组索引来实现,通常会涉及递归或栈操作。具体来说,对于数组中的每个节点,先访问该节点,然后根据数组索引找到左子节点和右子节点,并按同样方式进行遍历。 在这个问题中,...
本篇将详细介绍C++模拟栈操作的相关知识点。 首先,我们需要理解栈的基本操作。栈通常包括以下基本操作: 1. **压栈(push)**:将元素添加到栈顶。 2. **弹栈(pop)**:移除并返回栈顶元素。 3. **查看栈顶元素...
如果不在,就需要先 "Push" 一个数字再 "Pop" 一个数字,以模拟移除不需要的数字。 这个解法的时间复杂度为 O(n),其中 n 是目标数组的最大值。空间复杂度为 O(m),m 是目标数组的长度,因为使用了哈希表存储每个...
顺序栈和链式栈是两种常见的数据结构,用于模拟计算机内存中的栈操作。栈是一种后进先出(LIFO)的数据结构,常被用于函数调用、表达式求解、括号匹配等场景。本篇文章将详细介绍这两种栈的实现方式,并以数组和链表...
链式存储的线性表使用节点结构(如`struct node`)来表示元素,每个节点包含一个数据域和一个指向下一个节点的指针。这种方式允许动态调整表的大小,而无需预先知道表的长度。`create_link_list`函数展示了如何创建...
在这个项目中,“用数组栈实现表达式求值”是指使用数组来模拟栈这一数据结构,处理数学表达式的计算,特别是涉及括号配对的问题。 数组栈在表达式求值中的应用主要体现在中缀表达式转后缀表达式(逆波兰表示法)和...
- **数组栈操作**:数组栈的入栈是在数组的末尾添加元素,而出栈则是从数组末尾移除元素,同时更新栈顶指针。 - **数组栈优点**:数组栈的主要优点是访问速度快,因为数组元素可以通过索引直接访问,没有额外的...
这种方法尤其适用于需要频繁进行压栈和弹栈操作,但对元素访问顺序不敏感的情况。 总结起来,这个压缩包文件提供了关于链表和数组栈的知识点,包括链表的基本概念、Python中如何模拟链表、数组栈的LIFO原理以及如何...
1. **初始化栈**:创建一个数组来模拟顺序栈,并设置栈顶指针top为-1,表示栈为空。 2. **压栈(Push)**:当需要将新元素添加到栈时,会执行压栈操作。首先检查栈是否已满(即top是否等于数组长度减一),如果未满...
在两个栈模型中,一个栈用于入队操作,另一个用于出队操作。 1. 入队(enqueue)操作: 当需要将元素加入队列时,我们实际上是在第一个栈(称为“入队栈”)执行push操作。新元素被压入栈顶,这符合栈的LIFO特性。...
栈是后进先出(LIFO)的数据结构,可以用数组模拟;队列是先进先出(FIFO)的,同样可以使用数组来实现。这两种结构在处理任务调度、内存管理等方面非常有用。 数组的性能优化也是一个重要话题。合理选择数组大小、...
在C语言中,实现链表模拟栈需要定义节点结构体,包括数据和指向下一个节点的指针。同时,需要定义栈的结构体,包含链表头节点和其他可能的属性,如栈的大小。编写相应的函数来执行上述操作,如`push`、`pop`、`peek`...
实现一个大小固定的有序数组,支持动态增删改操作 实现两个有序数组合并为一个有序数组 链表 实现单链表、循环链表、双向链表,支持增删操作 实现单链表反转 实现两个有序的链表合并为一个有序链表 实现求链表...
使用 Array() 构造函数可以创建一个空数组、带有初始元素的数组、指定长度的数组等。数组直接量是一种简洁的创建数组的方式,只需要将元素用逗号分隔,放入方括号中即可。 数组的 length 属性是一个特殊的属性,它...
3. 指针数组和数组指针的区别:数组指针是一个指针,它指向一个数组的首地址;而指针数组是一个数组,它的每个元素是独立的指针。 总之,C++中的指针数组是一种强大的工具,能够帮助程序员处理复杂的任务,如动态...
对于数组,我们定义一个固定大小的数组并设置一个指针来跟踪栈顶位置;对于`std::vector`,其大小可以动态扩展,初始大小可设为0或预估的元素数量。例如,使用`std::vector`的初始化代码如下: ```cpp std::vector...