本文转自:疯狂Java 突破程序员基本功的16课
顺序存储结构的栈简称为顺序栈,它利用一组地址连续的存储单元依次存放从栈底到栈顶的数据元素。栈底位置固定不变,它的栈顶元素可以直接通过顺序栈底层数组的数组元素arr[size-1]来访问。
1.进栈
对于顺序栈的进栈操作而言,只需将新的数据元素存入栈内,然后再让记录栈内元素个数的变量+1,程序即可再次通过arr[size-1]重新访问新的栈顶元素。
由于顺序栈底层通常采用数组来保存数组元素,因此可能出现的情况是:当程序试图让一个数据元素进栈时,底层数组已满,那么就必须扩充底层数组的长度来容纳新进栈的数据元素。
2.出栈
对于顺序栈的出栈操作而言,需要将栈顶元素弹出栈,程序要做两件事情:
(1) 让记录栈内元素个数的变量-1
(2) 释放数组对栈顶元素的引用
对于删除操作来说,只要让记录栈内元素个数的size减少1,程序即可通过arr[size-1]访问到新的栈顶元素。但不要忘记释放原来栈顶元素的数组引用,否则会引起内存泄露。
SequenceStack.javapackage com.syc.crazejava.chapter10;
import java.util.Arrays;
public class SequenceStack<T> {
private int DEFAULT_SIZE = 10;
// 保存数组的长度
private int capacity;
// 定义当底层数组容量不够时,程序每次增加的数组长度
private int capacityIncrement = 0;
// 定义一个数组用于保存顺序栈的元素
private Object[] elementData;
// 保存顺序栈中元素的当前个数
private int size = 0;
// 以默认数组长度创建空顺序栈
public SequenceStack(){
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
// 以一个初始化元素来创建顺序栈
public SequenceStack(T element){
this();
elementData[0] = element;
size ++;
}
/**
* 以指定长度的数组来创建顺序栈
* @param element 指定顺序栈中第一个元素
* @param initSize 指定顺序栈底层数组的长度
*/
public SequenceStack(T element,int initSize){
this.capacity = initSize;
elementData = new Object[capacity];
elementData[0] = element;
size ++;
}
/**
* 以指定长度的数组来创建顺序栈
* @param element
* @param initSize
* @param capacityIncrement
*/
public SequenceStack(T element,int initSize,int capacityIncrement){
this.capacity = initSize;
this.capacityIncrement = capacityIncrement;
elementData = new Object[capacity];
elementData[0] = element;
size ++;
}
// 获取顺序栈的大小
public int length(){
return size;
}
// 入栈
public void push(T element){
ensureCapacity(size + 1);
elementData[size++] = element;
}
// 很麻烦,而且性能很差
private void ensureCapacity(int minCapacity){
// 如果数组的原有长度小于目前所需的长度
if(minCapacity > capacity){
if(capacityIncrement > 0){
while(capacity < minCapacity){
// 不断地将capacity长度加capacityIncrement
// 直到capacity大于minCapacity为止
capacity += capacityIncrement;
}
}else{
// 不断地将capacity*2,直到capacity大于minCapacity为止
while(capacity < minCapacity){
capacity <<= 1;
}
}
}
elementData = Arrays.copyOf(elementData, capacity);
}
// 出栈
@SuppressWarnings("unchecked")
public T pop(){
T oldValue = (T) elementData[size - 1];
// 释放栈顶元素
elementData[--size] = null;
return oldValue;
}
// 返回栈顶元素,但不删除栈顶元素
@SuppressWarnings("unchecked")
public T peek(){
return (T) elementData[size - 1];
}
// 判断顺序栈是否为空栈
public boolean empty(){
return size ==0;
}
// 清空顺序栈
public void clear(){
// 将底层数组所有元素赋为null
Arrays.fill(elementData, null);
size = 0;
}
public String toString(){
if(size == 0){
return "[]";
}else{
StringBuilder sb = new StringBuilder("[");
for(int i = size - 1;i > -1; i--){
sb.append(elementData[i].toString() + ",");
}
int len = sb.length();
return sb.delete(len - 1, len).append("]").toString();
}
}
}
SequenceStackTest.java
package com.syc.crazejava.chapter10;
public class SequenceStatckTest {
/**
* @param args
*/
public static void main(String[] args) {
SequenceStack<String> stack = new SequenceStack<String>();
// 不断地入栈
stack.push("aaa");
stack.push("bbb");
stack.push("ccc");
stack.push("ddd");
// 访问栈顶元素
System.out.println("访问栈顶元素:"+stack.peek());
// 弹出一个元素
System.out.println("第一次弹出栈顶元素:"+stack.pop());
// 再次弹出一个元素
System.out.println("第二次弹出栈顶元素:"+stack.pop());
System.out.println("两次pop之后的栈:"+stack);
}
}
引用
访问栈顶元素:ddd
第一次弹出栈顶元素:ddd
第二次弹出栈顶元素:ccc
两次pop之后的栈:[bbb,aaa]
分享到:
相关推荐
这些文件可能包含了用C++语言编写的栈的顺序存储结构实现。`StackLink`可能代表链式栈的实现,而`stack`可能是基于数组的顺序栈实现。`.dsp`和`.dsw`文件是旧版的Microsoft Visual Studio项目文件,`.ncb`是Visual ...
在这个实验中,我们将深入探讨栈的顺序存储结构,并通过C++语言来实现它。 栈的顺序存储结构,也称为线性存储,是最基础的栈实现方式之一。它使用一个连续的内存区域来存储栈中的元素,如同数组一样。在顺序栈中,...
在这个主题中,我们将深入探讨一种特殊的数据结构——栈(Stack),特别是它的顺序存储实现方式。栈是一种后进先出(Last In, First Out,简称LIFO)的数据结构,常被比喻为一叠盘子,新加入的盘子总是在最上面,要...
本文将详细介绍如何使用顺序存储结构来实现栈,并根据所给标题和描述,讨论相关的C语言实现细节。 首先,我们来看栈的顺序存储结构。在顺序栈中,元素被存储在一块连续的内存区域中,就像一个数组。这种存储方式...
在这个主题中,我们将专注于两种重要的数据结构实现:栈的顺序存储和链式存储。栈是一种特殊的数据结构,被称为“后进先出”(LIFO)结构,这意味着最后进入的元素将首先被取出。这种特性使得栈在许多算法和程序设计...
首先,实验的目标是让学生掌握栈的顺序存储结构,这涉及到在内存中如何动态地存储和管理数据。顺序栈通常使用数组作为基础,数组的一个端点(如一端)作为栈顶,元素的插入和删除都在这个端点进行。栈顶指针用于记录...
"数据结构栈实现进制的转换" 数据结构中,栈是一种重要的数据结构,它可以用来实现各种数据的转换。在这个例子中,我们将使用栈来实现十进制到十六进制的数据转换。 首先,让我们来了解一下栈的基本概念。栈是一种...
顺序栈,顾名思义,是按照元素在内存中的顺序存储数据的栈。在计算机内存中,顺序栈通常采用数组来实现。与链式栈不同,顺序栈的元素都是连续存储的,它的特点是插入和删除操作(通常称为压栈和出栈)都在栈顶进行,...
### 数据结构栈的实现 #### 实验目的 本次实验旨在帮助学生掌握栈的基本概念与实现方法,具体目标如下: 1. **理解栈的概念及其在内存中的存储方式**:熟悉栈的基本特性和工作原理,了解栈如何通过两种主要的存储...
栈的顺序存储即顺序栈是指,用一块连续的内存来存放一个栈,类似于数组,各元素在内存中是一个挨一个的。既然栈也是线性表,那么栈就可以通过线性表来实现,实现顺序栈只需在顺序表的插入删除操作时,只限定在一端...
栈的顺序存储结构是计算机科学中数据结构的一种实现方式,主要应用于处理需要后进先出(LIFO,Last In First Out)操作的问题。在本文中,我们探讨的是使用C++模板类来实现栈的顺序存储,这个实现适用于哈工大的软件...
编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作。【实验要求】 1、数据要求 顺序表中的数据是图书信息(书号、书名、价格)。 2、输入要求 输入n+1行,其中前n行是n本图书的信息(书号、书名、价格),每本...
在本实验“栈的顺序存储结构”中,我们深入学习了如何使用顺序存储来实现栈的各种操作。 栈的顺序存储结构通常通过数组来实现。在这个实验中,我们定义了一个结构体`SqStack`,它包含三个成员:`base`指向数组的...
在本示例中,“栈_顺序存储c代码”实现了这种数据结构在C语言中的具体应用。 顺序存储的栈通常使用数组来实现,因为数组可以提供连续的内存空间,方便进行元素的插入和删除操作。下面我们将深入探讨这个C代码实现的...
在这个主题中,我们将专注于两种基本的线性数据结构:栈和队列,特别是C语言实现的顺序栈。顺序栈是一种在内存中连续分配空间的抽象数据类型,它具有后进先出(LIFO)或先进后出(FILO)的特性。 ### 栈的基本概念 ...
综上所述,这个实验主要涵盖了数据结构中顺序栈的基本操作,包括栈的定义、初始化、进栈、出栈的实现,以及如何在实际编程中应用这些操作。通过对这些基本操作的理解和实践,学生能够更好地掌握栈这一重要数据结构的...
### 数据结构栈和队列知识点解析 #### 一、栈的基本概念与操作 **栈**是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端被称为栈顶,另一端被称为栈底。栈遵循先进后出(First In Last Out, FILO)的...
顺序栈是一种特殊的栈结构,它可以按照顺序存储和检索元素。在本例中,我们可以使用顺序栈来存储括号,并判断括号之间的匹配关系。 首先,我们需要定义一个顺序栈的数据结构,包括栈的底层结构和栈的操作接口。在本...
顺序栈是一种线性数据结构,它的元素在内存中是连续存储的,就像数组一样。栈顶是栈的唯一访问点,允许进行压栈(Push,即向栈顶添加元素)和弹栈(Pop,即移除栈顶元素)操作。由于这种特性,顺序栈的操作通常非常...