`

栈的Java实现--顺序栈

阅读更多

栈的Java实现--顺序栈

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

 

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。

 

由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表

 

堆栈数据结构使用两种基本操作:压入(push)和弹出(pop):

  • 压入:将数据放入堆栈的顶端(阵列形式或串行形式),堆栈顶端top指标加一。
  • 弹出:将顶端数据资料输出(回传),堆栈顶端资料减一。

File:Data stack.svg

 

 栈的实现方式也有顺序存储结构和链式存储结构。

 

下面是顺序存储结构实现的栈,即顺序栈

 顺序栈的存储方式:

顺序栈的进栈: 

 对于顺序栈的进栈操作,只要将新的数据元素存入栈内,然后将记录栈内元素个数的size+1即可。同时要保证底层数组的长度可以容纳新的数据元素。出栈:

  •  让记录栈内元素个数的size-1
  • 释放数组对原栈顶元素的引用

 

顺序栈的Java实现:

 

package com.liuhao.DataStructures;

import java.util.Arrays;

public class SequenceStack<T> {

	private final 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) {
		this.ensureCapacity(size + 1);

		// 将元素放到数组,同时让长度+1
		elementData[size++] = element;
	}

	// 保证底层数组的长度
	private void ensureCapacity(int minCapacity) {

		// 如果数组的原有长度小于目前所需的长度
		if (minCapacity > capacity) {
			// 如果给定了数组长度增量
			if (capacityIncrement > 0) {
				while (minCapacity > capacity) {
					// 不断的将capacity的长度增加,直到大于minCapacity
					capacity += capacityIncrement;
				}
			}
			// 若没有给定增量
			else {
				while (minCapacity > capacity) {
					// 不断的将capacity加倍,直到大于minCapacity
					capacity <<= 1;
				}
			}

			// 将原来的数组的长度变为新的capacity
			elementData = Arrays.copyOf(elementData, capacity);
		}
	}

	// 出栈
	public T pop() {

		// 若当前为空栈,则弹出null
		if (size == 0) {
			return null;
		}

		T oldValue = (T) elementData[size - 1];
		// 释放栈顶元素,同时将长度-1
		elementData[--size] = null;
		return oldValue;
	}

	// 获取栈顶元素
	public T getPeek() {

		// 若当前为空栈,则返回null
		if (size == 0) {
			return null;
		}
		return (T) elementData[size - 1];
	}

	// 判断是否为空
	public boolean isEmpty() {
		return size == 0;
	}

	// 情况顺序栈
	public void clear() {
		Arrays.fill(elementData, null);
		size = 0;
	}

	public String toString() {
		if (size == 0) {
			return "[]";
		} else {
			StringBuilder sb = new StringBuilder("[");
			for (int i = size - 1; i >= 0; i--) {
				sb.append(elementData[i].toString() + ", ");
			}

			sb.append("]");

			int length = sb.length();

			// 删除多余的“,”和空格
			return sb.delete(length - 3, length - 1).toString();
		}
	}
}

 

测试代码:

package com.liuhao.test;

import org.junit.Test;

import com.liuhao.DataStructures.SequenceStack;

public class SequenceStackTest {

	@Test
	public void test() {

		// 以指定第一个元素和底层数组长度的方式构建顺序栈
		SequenceStack<String> sStack = new SequenceStack<String>("我", 2);
		System.out.println("当前所含内容" + sStack);

		// 压入数据元素,元素格式大于了定义栈时底层数组的长度
		sStack.push("是");
		sStack.push("liuhao");
		sStack.push("程序员");
		// 发现是先入后出的方式打印的
		System.out.println("当前所含内容" + sStack);
		// 获取栈中元素个数
		System.out.println("当前栈中元素个数是:" + sStack.length());
		// 获取栈顶元素
		System.out.println("当前栈顶元素是:" + sStack.getPeek());

		// 弹出元素
		System.out.println("弹出元素:" + sStack.pop());
		// 发现是先入后出的方式打印的
		System.out.println("当前所含内容" + sStack);
		// 获取栈顶元素
		System.out.println("当前栈顶元素是:" + sStack.getPeek());
		// 获取栈中元素个数
		System.out.println("当前栈中元素个数是:" + sStack.length());

		// 判断是否为空栈
		System.out.println("当前栈是否为空:" + sStack.isEmpty());
		// 清空栈
		sStack.clear();
		// 判断是否为空栈
		System.out.println("当前栈是否为空:" + sStack.isEmpty());
		// 获取栈顶元素,空栈时返回null
		System.out.println("当前栈顶元素是:" + sStack.getPeek());
		// 获取栈中元素个数
		System.out.println("当前栈中元素个数是:" + sStack.length());

		// 空栈时进行弹出元素
		System.out.println("弹出元素:" + sStack.pop());
	}

}

 

测试结果:



 

 

代码获取地址:https://github.com/liuhao123/JavaMore.git

 

  • 大小: 6.2 KB
  • 大小: 7.6 KB
  • 大小: 12 KB
  • 大小: 11 KB
  • 大小: 6.5 KB
0
0
分享到:
评论

相关推荐

    java实现的顺序栈

    java实现的顺序栈,部分代码:public class OrderStack { int top=-1; String[] stack; public OrderStack(int initcap)throws Exception{ if(initcap){

    Java语言编写的数据结构-栈实现

    Java中,我们可以通过扩展ArrayList类来实现顺序栈。`stack_SqStack`可能是一个包含以下功能的Java类: - `push(E element)`: 将元素压入栈顶。 - `pop()`: 弹出栈顶元素并返回。 - `peek()`: 查看但不移除栈顶...

    顺序栈的表示和实现源码

    在顺序栈中,元素存储在一块连续的内存区域中,通过数组或动态数组来实现。顺序栈的操作通常包括初始化、判断栈是否为空、获取栈顶元素、进栈(压栈)、出栈(弹栈)以及销毁栈等。下面我们将详细讨论这些知识点。 ...

    java实现顺序栈

    Java实现顺序栈是一种常见的数据结构操作,主要用于存储和管理元素序列。栈是一种后进先出(LIFO,Last In First Out)的数据结构,通常用于执行回溯、递归等算法。在Java中,我们可以使用数组或ArrayList来实现顺序...

    线性表,单链表,栈 java实现

    下面将详细解释这些概念及其Java实现。 **线性表** 是一种基本的数据结构,它是由n(n&gt;=0)个相同类型元素构成的有限序列。线性表中的元素具有顺序关系,即每个元素都有一个前驱和后继,除了第一个元素没有前驱,...

    栈的Java语言实现

    ### 栈的Java语言实现详解 #### 一、栈的基本概念 栈是一种特殊的线性表,只允许在表的一端...这些内容不仅有助于理解栈的工作原理,还能帮助读者掌握栈的Java实现技巧,为进一步学习算法和数据结构打下坚实的基础。

    顺序栈实现源码(C、C++、Java)

    在C中,我们通常使用数组作为基础数据结构来实现顺序栈。以下是一个简单的顺序栈定义: ```c #define MAX_SIZE 100 // 定义栈的最大容量 typedef int ElementType; // 定义栈元素的类型 typedef struct { Element...

    java模拟顺序栈实现回文串的判断

    本主题将探讨如何使用Java语言通过模拟顺序栈来判断一个字符串是否为回文串。这个方法对于初学者来说是很好的实践,因为它涉及到基础的数据结构——栈,以及字符串处理技巧。 首先,我们需要理解栈(Stack)这种...

    Java算法实例-链栈和顺序栈操作

    在这个Java算法实例中,"SepStack1501203023"和"LinkStack1501203023"可能代表两个类,分别实现了顺序栈和链栈的抽象数据类型(ADT)。这些类可能包含了如下功能: - `push(E element)`:向栈顶添加一个元素。 - `...

    继承实现顺序栈学习代码示例

    在这个“继承实现顺序栈”的示例中,我们将深入探讨如何使用面向对象编程中的继承概念来创建一个顺序栈。顺序栈是栈的一种实现方式,它使用数组作为底层数据结构。 首先,我们要理解什么是继承。继承是面向对象编程...

    Java虚拟机栈--栈帧.docx

    Java虚拟机栈是Java执行引擎的关键组成部分,它用于支持方法的执行。栈帧则是虚拟机栈的基本工作单元,每个线程在执行Java方法时都会有一个对应的栈帧。栈帧存储了方法执行期间所需的所有信息,主要包括以下几个核心...

    顺序栈的基本操作和实现

    顺序栈是一种常见的数据结构,它在内存中连续存储元素,具有简单易用、效率较高的特点。...在设计和实现顺序栈时,我们需要关注动态扩容、边界条件处理和效率优化等方面,以实现高效可靠的栈操作。

    Java实现顺序栈原理解析

    Java实现顺序栈原理解析 Java实现顺序栈原理解析是指使用Java语言实现顺序栈的数据结构,顺序栈是一种特殊的线性表,限制了元素的插入和删除只能在线性表的同一端进行。下面将详细介绍Java实现顺序栈原理解析的知识...

    java--基础程序知识.rar

    - Java虚拟机(JVM)负责解释和执行Java字节码,内存分为堆、栈、方法区等区域,自动进行垃圾回收。 10. **Java标准库** - Java标准库提供了大量预先定义的类和接口,涵盖了I/O、网络、多线程、XML解析、数据库...

    顺序栈通常使用数组来实现,其特点是在栈底预先分配好一块存储空间,栈顶指针指向栈顶元素 以下是一个简单的Java实现:.txt

    顺序栈是一种使用数组来实现栈的结构,在Java中,这种实现方式是基本且常见的。 根据给定的文件信息,我们可以详细展开顺序栈在Java中的实现和相关知识点。首先,顺序栈的关键特性在于它在栈底预先分配好一块存储...

    数据结构--表、栈、队列(java)

    ### 数据结构概述与Java实现 #### 一、表(List) **表**是一种常见的线性数据结构,它允许用户在任意位置插入或删除元素。在Java中,表通常由`List`接口表示。 ##### 1. 数组实现 **数组实现**的表,即`...

    算法 第4版-谢路云 译 Java描述 -完整版.pdf

    《算法 第4版》是由计算机科学家罗伯特·塞弗(Robert Sedgewick)和凯文·韦恩(Kevin Wayne)共同编著的一本经典算法教程,由谢路云翻译为中文,...结合压缩包中的Java实现,读者可以亲手实践,加深理解,提升编程能力。

    顺序栈代码

    在编程实现顺序栈时,需要注意以下几点: - **溢出处理**:当栈满时继续push操作会导致溢出,需要检查数组是否已满并执行扩容操作。 - **下溢处理**:当栈空时进行pop操作会导致下溢,需要有相应的错误处理机制。 - ...

    Java定义栈结构,并实现入栈、出栈操作完整示例

    Java定义栈结构,并实现入栈、出栈操作完整示例 本文主要介绍了Java定义栈结构,并实现入栈、出栈操作,结合完整实例形式分析了java数据结构中栈的定义、以及入栈、出栈、栈是否为空判断、栈大小计算、打印栈元素等...

Global site tag (gtag.js) - Google Analytics