`

【数据结构】栈的顺序存储结构及实现

 
阅读更多
本文转自:疯狂Java 突破程序员基本功的16课

    顺序存储结构的栈简称为顺序栈,它利用一组地址连续的存储单元依次存放从栈底到栈顶的数据元素。栈底位置固定不变,它的栈顶元素可以直接通过顺序栈底层数组的数组元素arr[size-1]来访问。

1.进栈
    对于顺序栈的进栈操作而言,只需将新的数据元素存入栈内,然后再让记录栈内元素个数的变量+1,程序即可再次通过arr[size-1]重新访问新的栈顶元素。
    由于顺序栈底层通常采用数组来保存数组元素,因此可能出现的情况是:当程序试图让一个数据元素进栈时,底层数组已满,那么就必须扩充底层数组的长度来容纳新进栈的数据元素。

2.出栈
    对于顺序栈的出栈操作而言,需要将栈顶元素弹出栈,程序要做两件事情:
  (1) 让记录栈内元素个数的变量-1
  (2) 释放数组对栈顶元素的引用
 
   对于删除操作来说,只要让记录栈内元素个数的size减少1,程序即可通过arr[size-1]访问到新的栈顶元素。但不要忘记释放原来栈顶元素的数组引用,否则会引起内存泄露。

SequenceStack.java
package 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实现

    本文将详细介绍如何使用顺序存储结构来实现栈,并根据所给标题和描述,讨论相关的C语言实现细节。 首先,我们来看栈的顺序存储结构。在顺序栈中,元素被存储在一块连续的内存区域中,就像一个数组。这种存储方式...

    《数据结构》--栈的顺序存储和链式存储

    在这个主题中,我们将专注于两种重要的数据结构实现:栈的顺序存储和链式存储。栈是一种特殊的数据结构,被称为“后进先出”(LIFO)结构,这意味着最后进入的元素将首先被取出。这种特性使得栈在许多算法和程序设计...

    数据结构顺序栈验证实验报告.pdf

    首先,实验的目标是让学生掌握栈的顺序存储结构,这涉及到在内存中如何动态地存储和管理数据。顺序栈通常使用数组作为基础,数组的一个端点(如一端)作为栈顶,元素的插入和删除都在这个端点进行。栈顶指针用于记录...

    数据结构栈实现进制的转换

    "数据结构栈实现进制的转换" 数据结构中,栈是一种重要的数据结构,它可以用来实现各种数据的转换。在这个例子中,我们将使用栈来实现十进制到十六进制的数据转换。 首先,让我们来了解一下栈的基本概念。栈是一种...

    数据结构 顺序栈

    顺序栈,顾名思义,是按照元素在内存中的顺序存储数据的栈。在计算机内存中,顺序栈通常采用数组来实现。与链式栈不同,顺序栈的元素都是连续存储的,它的特点是插入和删除操作(通常称为压栈和出栈)都在栈顶进行,...

    数据结构栈的实现

    ### 数据结构栈的实现 #### 实验目的 本次实验旨在帮助学生掌握栈的基本概念与实现方法,具体目标如下: 1. **理解栈的概念及其在内存中的存储方式**:熟悉栈的基本特性和工作原理,了解栈如何通过两种主要的存储...

    顺序栈的C语言实现(栈的顺序存储)

    栈的顺序存储即顺序栈是指,用一块连续的内存来存放一个栈,类似于数组,各元素在内存中是一个挨一个的。既然栈也是线性表,那么栈就可以通过线性表来实现,实现顺序栈只需在顺序表的插入删除操作时,只限定在一端...

    栈的顺序存储结构

    栈的顺序存储结构是计算机科学中数据结构的一种实现方式,主要应用于处理需要后进先出(LIFO,Last In First Out)操作的问题。在本文中,我们探讨的是使用C++模板类来实现栈的顺序存储,这个实现适用于哈工大的软件...

    数据结构顺序栈实验2

    编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作。【实验要求】 1、数据要求 顺序表中的数据是图书信息(书号、书名、价格)。 2、输入要求 输入n+1行,其中前n行是n本图书的信息(书号、书名、价格),每本...

    数据结构栈的顺序存储结构LAB04-1.pdf

    在本实验“栈的顺序存储结构”中,我们深入学习了如何使用顺序存储来实现栈的各种操作。 栈的顺序存储结构通常通过数组来实现。在这个实验中,我们定义了一个结构体`SqStack`,它包含三个成员:`base`指向数组的...

    栈_顺序存储c代码

    在本示例中,“栈_顺序存储c代码”实现了这种数据结构在C语言中的具体应用。 顺序存储的栈通常使用数组来实现,因为数组可以提供连续的内存空间,方便进行元素的插入和删除操作。下面我们将深入探讨这个C代码实现的...

    数据结构---栈和队列之顺序栈(C语言)

    在这个主题中,我们将专注于两种基本的线性数据结构:栈和队列,特别是C语言实现的顺序栈。顺序栈是一种在内存中连续分配空间的抽象数据类型,它具有后进先出(LIFO)或先进后出(FILO)的特性。 ### 栈的基本概念 ...

    数据结构栈的实验报告.doc

    综上所述,这个实验主要涵盖了数据结构中顺序栈的基本操作,包括栈的定义、初始化、进栈、出栈的实现,以及如何在实际编程中应用这些操作。通过对这些基本操作的理解和实践,学生能够更好地掌握栈这一重要数据结构的...

    数据结构栈和队列(参考代码)

    ### 数据结构栈和队列知识点解析 #### 一、栈的基本概念与操作 **栈**是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端被称为栈顶,另一端被称为栈底。栈遵循先进后出(First In Last Out, FILO)的...

    顺序栈实现括号配对

    顺序栈是一种特殊的栈结构,它可以按照顺序存储和检索元素。在本例中,我们可以使用顺序栈来存储括号,并判断括号之间的匹配关系。 首先,我们需要定义一个顺序栈的数据结构,包括栈的底层结构和栈的操作接口。在本...

    数据结构——顺序栈的C语言实现

    顺序栈是一种线性数据结构,它的元素在内存中是连续存储的,就像数组一样。栈顶是栈的唯一访问点,允许进行压栈(Push,即向栈顶添加元素)和弹栈(Pop,即移除栈顶元素)操作。由于这种特性,顺序栈的操作通常非常...

Global site tag (gtag.js) - Google Analytics