Java栈之顺序栈存储结构实现

一、栈的基本定义

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

二、顺序栈的实现

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

  1 package com.ietree.basic.datastructure.stack;
  2
  3 import java.util.Arrays;
  4
  5 /**
  6  * 顺序栈
  7  *
  8  * Created by ietree
  9  * 2017/4/29
 10  */
 11 public class SequenceStack<T> {
 12
 13     private int DEFAULT_SIZE = 10;
 14     // 保存数组的长度
 15     private int capacity;
 16     // 定义当底层数组容量不够时,程序每次增加的数组长度
 17     private int capacityIncrement = 0;
 18     // 定义一个数组用于保存顺序栈的元素
 19     private Object[] elementData;
 20     // 保存顺序栈中元素的当前个数
 21     private int size = 0;
 22
 23     // 以默认数组长度创建空顺序栈
 24     public SequenceStack() {
 25
 26         capacity = DEFAULT_SIZE;
 27         elementData = new Object[capacity];
 28
 29     }
 30
 31     // 以一个初始化元素来创建顺序栈
 32     public SequenceStack(T element) {
 33
 34         this();
 35         elementData[0] = element;
 36         size++;
 37
 38     }
 39
 40     /**
 41      * 以指定长度的数组来创建顺序线性表
 42      *
 43      * @param element 指定顺序栈中第一个元素
 44      * @param initSize 指定顺序栈底层数组的长度
 45      */
 46     public SequenceStack(T element, int initSize) {
 47
 48         this.capacity = initSize;
 49         elementData = new Object[capacity];
 50         elementData[0] = element;
 51         size++;
 52
 53     }
 54
 55     /**
 56      * 以指定长度的数组来创建顺序栈
 57      *
 58      * @param element 指定顺序栈中第一个元素
 59      * @param initSize 指定顺序栈底层数组的长度
 60      * @param capacityIncrement 指定当顺序栈底层数组的长度不够时,底层数组每次增加的长度
 61      */
 62     public SequenceStack(T element, int initSize, int capacityIncrement) {
 63
 64         this.capacity = initSize;
 65         this.capacityIncrement = capacityIncrement;
 66         elementData = new Object[capacity];
 67         elementData[0] = element;
 68         size++;
 69
 70     }
 71
 72     /**
 73      * 获取顺序栈的大小
 74      *
 75      * @return 顺序栈的大小值
 76      */
 77     public int length(){
 78
 79         return size;
 80
 81     }
 82
 83     /**
 84      * 入栈
 85      *
 86      * @param element 入栈的元素
 87      */
 88     public void push(T element) {
 89
 90         ensureCapacity(size + 1);
 91         elementData[size++] = element;
 92
 93     }
 94
 95     /**
 96      * 确认数组的长度是否满足push之后的长度
 97      *
 98      * @param minCapacity 数组需要的最小长度
 99      */
100     public void ensureCapacity(int minCapacity) {
101
102         // 如果数组的原有长度小于目前所需要的长度
103         if (minCapacity > capacity) {
104
105             if (capacityIncrement > 0) {
106
107                 while (capacity < minCapacity) {
108                     // 不断地将capacity长度加capacityIncrement
109                     // 直到capacity大于minCapacity为止
110                     capacity += capacityIncrement;
111
112                 }
113             } else {
114
115                 // 不断地将capacity * 2,直到capacity大于minCapacity为止
116                 while (capacity < minCapacity) {
117
118                     capacity <<= 1;
119
120                 }
121
122             }
123             elementData = Arrays.copyOf(elementData, capacity);
124         }
125
126     }
127
128     /**
129      * 出栈
130      *
131      * @return 出栈的元素
132      */
133     public T pop() {
134
135         T oldValue = (T) elementData[size - 1];
136         // 释放栈顶元素
137         elementData[--size] = null;
138         return oldValue;
139
140     }
141
142     // 返回栈顶元素,但不删除栈顶元素
143     public T peek() {
144
145         return (T) elementData[size - 1];
146
147     }
148
149     // 判断顺序栈是否为空
150     public boolean empty() {
151
152         return size == 0;
153
154     }
155
156     // 清空顺序栈
157     public void clear() {
158
159         // 将底层数组所有元素赋值为null
160         Arrays.fill(elementData, null);
161         size = 0;
162
163     }
164
165     public String toString() {
166
167         if (size == 0) {
168
169             return "[]";
170
171         } else {
172
173             StringBuilder sb = new StringBuilder("[");
174             for (int i = size - 1; i > -1; i--) {
175                 sb.append(elementData[i].toString() + ", ");
176             }
177             int len = sb.length();
178             return sb.delete(len - 2, len).append("]").toString();
179         }
180
181     }
182
183 }

测试类:

 1 package com.ietree.basic.datastructure.stack;
 2
 3 /**
 4  * Created by ietree
 5  * 2017/4/29
 6  */
 7 public class SequenceStackTest {
 8
 9     public static void main(String[] args) {
10
11         SequenceStack<String> stack = new SequenceStack<String>();
12
13         stack.push("aaaa");
14         stack.push("bbbb");
15         stack.push("cccc");
16         stack.push("dddd");
17         System.out.println(stack);
18
19         System.out.println("访问栈顶元素:" + stack.peek());
20
21         System.out.println("第一次弹出栈顶元素:" + stack.pop());
22
23         System.out.println("第二次弹出栈顶元素:" + stack.pop());
24
25         System.out.println("两次pop之后的栈:" + stack);
26
27     }
28
29 }

程序输出:

[dddd, cccc, bbbb, aaaa]
访问栈顶元素:dddd
第一次弹出栈顶元素:dddd
第二次弹出栈顶元素:cccc
两次pop之后的栈:[bbbb, aaaa]
时间: 2024-11-03 22:25:11

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

栈的链式存储结构及应用(C、Java代码)

链式存储结构最大的好处就是没有空间的限制,可以通过指针指向将结点像以链的形式把结点链接,我们熟悉的线性表就有链式存储结构. 当然,栈同样有链式存储结构,栈的链式存储结构,简称链栈. 从图片可以看到,和单链表很像,拥有一个头指针top,又称作栈顶指针,所以此时就不再需要单链表里面的头结点了. 对于链栈来说,基本不存在栈满的情况,除非计算机内存已经没有了可使用的空间,如果真的存在,那么计算机系统已经面临着即将死机崩溃的情况,而不是这个链栈是否溢出的问题了. 对于空栈来说,链表的定义是头指针指向NUL

使用JAVA数组实现顺序栈

1,首先总结一下线性表(分为顺序表和链接表,[即顺序存储结构和链式存储结构的区别])和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现: java.util.ArrayList 实现了顺序表,java.util.LinkedList 实现了链接表的功能. java.util.ArrayDeque实现了顺序栈和顺序队列(该类中即定义了与栈操作有关的方法,也定义了与队列操作有关的方法).java.util.LinkedList实现了链接栈和链接队列. 2,定义了一个Stack

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

栈及栈的链式存储结构(栈链)

栈:线性结构,后进先出.栈(Stack)是一种特殊的线性表(顺序表,链表)只在表尾进行删除和插入操作. 注意:对于栈来说,表尾称为栈的栈顶(top),表头称为栈底(bottom). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.

Java数据结构-线性表之栈(顺序栈和链栈)

栈的定义:(特殊的线性表) ??仅在表的一端进行插入和删除的线性表.允许插入.删除的这一端称为栈顶,另一端称为栈底.表中没有元素时称为空栈. ??被称为后进先出的线性表(Last In First Out),简称 LIFO表,或被称为先进后出的线性表(First In Last Out),简称 FILO表. ??栈更具存储方式的不同分为两种:顺序栈和链栈. 顺序栈: 和顺序表一样,顺序栈也采用数组来存放数据元素: 为了保证栈底位置的不变,采用数组下标为0的位置作为顺序栈的栈底. 而栈顶指针的最大

栈的两种存储结构

内容:栈的两种存储结构 栈的特点: 在固定一端进行插入删除,在栈顶进行 链式存储结构(不带头结点): class StackNode { public: int data; StackNode *next; StackNode():next(NULL){} }; class StackLine { public: StackNode *top; int count; StackLine():top(NULL),count(0){} //无初始化函数因为无需头结点 void pop(StackLi

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

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

0 栈的基本概念 栈,根据存储结构的不同,可分为:链栈和顺序栈. 1 顺序栈的知识概览 2 编程复现 2.1 定义基本数据结构 typedef char DataType; // 基本数据类型 enum Status { ERROR, OK, OVERFLOW };// 状态(码) : 枚举类型 #define MAXSIZE_STACK 100 //栈内最大元素数 typedef struct { // 顺序栈 DataType *base; // 栈底指针 (NULL:栈结构不存在:[重点]

数据结构(java语言描述)顺序栈的使用(两个大数相加)

利用http://www.cnblogs.com/xleer/p/5289661.html中对顺序栈以及栈的进本方法的定义,实现超过整数上限的两个数的加法计算. 算法: package stack;/********************************************************************** * @author sch ********利用栈,计算两个大数的和.大数的值超过int存储的范围******************************