一、栈的基本定义

栈是一种数据结构,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入、删除操作的特殊线性表,通常就是在线性表的尾端进行插入、删除操作。

二、顺序栈的实现

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

 package com.ietree.basic.datastructure.stack;

 import java.util.Arrays;

 /**
* 顺序栈
*
* Created by ietree
* 2017/4/29
*/
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++; } /**
* 获取顺序栈的大小
*
* @return 顺序栈的大小值
*/
public int length(){ return size; } /**
* 入栈
*
* @param element 入栈的元素
*/
public void push(T element) { ensureCapacity(size + 1);
elementData[size++] = element; } /**
* 确认数组的长度是否满足push之后的长度
*
* @param minCapacity 数组需要的最小长度
*/
public 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);
} } /**
* 出栈
*
* @return 出栈的元素
*/
public T pop() { T oldValue = (T) elementData[size - 1];
// 释放栈顶元素
elementData[--size] = null;
return oldValue; } // 返回栈顶元素,但不删除栈顶元素
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 - 2, len).append("]").toString();
} } }

测试类:

 package com.ietree.basic.datastructure.stack;

 /**
* Created by ietree
* 2017/4/29
*/
public class SequenceStackTest { public static void main(String[] args) { SequenceStack<String> stack = new SequenceStack<String>(); stack.push("aaaa");
stack.push("bbbb");
stack.push("cccc");
stack.push("dddd");
System.out.println(stack); System.out.println("访问栈顶元素:" + stack.peek()); System.out.println("第一次弹出栈顶元素:" + stack.pop()); System.out.println("第二次弹出栈顶元素:" + stack.pop()); System.out.println("两次pop之后的栈:" + stack); } }

程序输出:

[dddd, cccc, bbbb, aaaa]
访问栈顶元素:dddd
第一次弹出栈顶元素:dddd
第二次弹出栈顶元素:cccc
两次pop之后的栈:[bbbb, aaaa]

Java栈之顺序栈存储结构实现的更多相关文章

  1. 使用JAVA数组实现顺序栈

    1,首先总结一下线性表(分为顺序表和链接表,[即顺序存储结构和链式存储结构的区别])和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现: java.util.ArrayList ...

  2. C++编程练习(4)----“实现简单的栈的链式存储结构“

    如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...

  3. C++栈学习——顺序栈和链栈的差别

    C++中栈有顺序栈和链栈之分.在顺序栈中,定义了栈的栈底指针(存储空间首地址base).栈顶指针top以及顺序存储空间的大小stacksize(个人感觉这个数据成员是能够不用定义的) //顺序栈数据结 ...

  4. [C++]数据结构:栈之顺序栈

    0 栈的基本概念 栈,根据存储结构的不同,可分为:链栈和顺序栈. 1 顺序栈的知识概览 2 编程复现 2.1 定义基本数据结构 typedef char DataType; // 基本数据类型 enu ...

  5. 栈(顺序栈)----C语言

    栈 栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底 顺序栈(顺序结构) 顺序栈:用一段连续的存储空间来存储栈中的数据 ...

  6. Java中Map<Key, Value>存储结构根据值排序(sort by values)

    需求:Map<key, value>中可以根据key, value 进行排序,由于 key 都是唯一的,可以很方便的进行比较操作,但是每个key 对应的value不是唯一的,有可能出现多个 ...

  7. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  8. Java运算符及顺序、选择结构

    :运算符(掌握) ()算术运算符 A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正号 c:字符串连接符 C:/和%的区别 数据做除法操作的时候,/取得是商,%取得是余数 D:++和- ...

  9. 【Java】 大话数据结构(6) 栈的顺序与链式存储

    本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...

随机推荐

  1. 常用的easyui使用方法之二

    -------datagrid 1.获取某行的行号(row)tdg.datagrid('getRowIndex',rows)2.通过行号移除该行tdg.datagrid('deleteRow',ind ...

  2. 数据库 Proc编程二

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

  3. 构造方法也可以实现overloading

    构造方法也可以实现overloading.例: public void teach(){}; public void teach(int a){}; public void teach(String ...

  4. ytu 1052: 写一函数,将两个字符串连接(水题,指针练习)

    1052: 写一函数,将两个字符串连接 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 343  Solved: 210[Submit][Status][ ...

  5. 《Programming with Objective-C》第五章 Customizing Existing Classes

    1.分类里面只新增函数,不要新增变量:虽然新增是语法合法的,但是编译器并不会为你的property合成相应的成员变量.setter和getter Categories can be used to d ...

  6. Python3x 爬取妹子图

    思路:1.get_totalpages(url)  通过[性.感.美.女.图]获得该版块的总页数 [首页1234567891011下一页末页共 21页1034条] 2.get_sercoverurl( ...

  7. sessionStorage与localStorage

    客户端存储数据的两个对象为: localStorage和sessionStorage一样都是用来存储客户端临时信息的对象. 他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目 ...

  8. LAMP集群项目三 配置业务服务器

    安装MySQL 参考脚本:CentOS6.5一键安装MySQL5.5.32(源码编译) 在备份服务器上配置rsync推送任务 在备份服务器上配置  /etc/rsyncd.conf #在所有的客户端都 ...

  9. Ubuntu 中 apache 开启 rewrite 模块

    ubuntu14.04中安装好apache2.4之后默认rewrite模块是不开启的,项目public目录下的.htaccess文件就用不了,在浏览器中访问网页总是报500错误,原因就是这个. 执行下 ...

  10. 170310、Jenkins部署Maven多环境项目(dev、beta、prod)的参数设置

    使用Jenkins配置Git+Maven的自动化构建: http://blog.csdn.net/xlgen157387/article/details/50353317 在一个多开发和生产环境的项目 ...