4、栈的实现:顺序存储和链式存储

Stack的ADT:

 1 package ren.laughing.datastructure.base;
 2
 3 import ren.laughing.datastructure.exception.StackEmptyException;
 4
 5 /**
 6  * Stack 栈:后进先出
 7  * 只能在栈顶top进行插入(入栈)、删除(出栈)操作
 8  * @author Laughing_Lz
 9  * @time 2016年4月6日
10  */
11 public interface Stack {
12     //返回堆栈的大小
13     public int getSize();
14     //判断堆栈是否为空
15     public boolean isEmpty();
16     //数据元素 e入栈
17     public void push(Object e);
18     //栈顶元素出栈
19     public Object pop() throws StackEmptyException;
20     //取栈顶元素
21     public Object peek() throws StackEmptyException;
22     }

栈的顺序存储:

 1 package ren.laughing.datastructure.baseImpl;
 2
 3 import ren.laughing.datastructure.base.Stack;
 4 import ren.laughing.datastructure.exception.StackEmptyException;
 5 /**
 6  * 栈的顺序存储结构
 7  * 一般来说在构造堆栈时不应设定堆栈的最大容量。
 8  * 一种合理的做法为先为堆栈分配一个基本容量,然后在实际的使用过程中,
 9  * 当堆栈的空间不够时再倍增存储空间,这个过程所需的时间均摊到每个数
10  * 据元素时间为Θ(1),不会影响操作实现的时间复杂度。
11  * @author Laughing_Lz
12  * @time 2016年4月6日
13  */
14 public class StackArray implements Stack {
15     private final int LEN = 8;//默认数组的存储大小
16     private Object[] elements;//数据元素数组
17     private int top;//栈顶指针
18
19     public StackArray() {
20         this.elements = new Object[LEN];
21         this.top = -1;//top为-1时表示空栈
22     }
23
24     @Override
25     public int getSize() {
26         return top+1;
27     }
28
29     @Override
30     public boolean isEmpty() {
31         if(top < 0){
32             return true;
33         }else{
34             return false;
35         }
36     }
37
38     @Override
39     public void push(Object e) {
40         if(getSize()>=elements.length){
41             expandSpace();
42         }
43         //++top:因为入栈操作相当于insertAfter,
44         //只能在顶点后插入,所以首先将top加1,再放入数据元素
45         elements[++top] = e;
46     }
47
48     @Override
49     public Object pop() throws StackEmptyException {
50         if(top<0){
51             throw new StackEmptyException("错误:栈为空,不可出栈操作");
52         }else{
53             Object obj = elements[top];
54             elements[top--] = null;//先取出原栈顶数据元素,再置空、top减一
55             return obj;
56         }
57     }
58     //取栈顶元素
59     @Override
60     public Object peek() throws StackEmptyException {
61         if(getSize()<=0){
62             throw new StackEmptyException("错误:栈顶为空");
63         }else{
64             return elements[top];
65         }
66     }
67     /**
68      * 扩充数组长度
69      */
70     private void expandSpace() {
71         Object[] a = new Object[elements.length * 2];
72         for (int i = 0; i < elements.length; i++)
73             a[i] = elements[i];
74         elements = a;
75     }
76 }

栈的链式存储:

 1 package ren.laughing.datastructure.baseImpl;
 2
 3 import ren.laughing.datastructure.base.Stack;
 4 import ren.laughing.datastructure.exception.StackEmptyException;
 5 /**
 6  * Stack的链式存储
 7  * ★此链表为的不含头结点的单链表
 8  * @author Laughing_Lz
 9  * @time 2016年4月6日
10  */
11 public class StackLinked implements Stack{
12     private SLNode top;//链表首结点引用
13     private int size;//栈的大小
14
15     public StackLinked() {
16         this.size = 0;
17 //        this.top = new SLNode(null, null);
18         top = null;//这个是否也实例化了呢?和上面是否有区别?
19     }
20
21     @Override
22     public int getSize() {
23         return size;
24     }
25
26     @Override
27     public boolean isEmpty() {
28         return size==0;
29     }
30
31     @Override
32     public void push(Object e) {
33         SLNode node = new SLNode(e, top);//相当于insertBefore 在原栈顶前插入新的数据元素
34         top = node;
35         size++;
36     }
37
38     @Override
39     public Object pop() throws StackEmptyException {
40         if (size<=0){
41             throw new StackEmptyException("错误,堆栈为空。");
42         }
43         Object obj = top.getData();
44         top = top.getNext();
45         size--;
46         return obj;
47     }
48
49     @Override
50     public Object peek() throws StackEmptyException {
51         if (size<=0){
52             throw new StackEmptyException("错误,堆栈为空。");
53         }
54         Object obj = top.getData();
55         return obj;
56     }
57
58 }
时间: 2024-11-09 04:29:20

4、栈的实现:顺序存储和链式存储的相关文章

队列的定义与操作——顺序存储和链式存储

队列的 存储结构 有 顺序存储 和 链式存储. 1. 队列的顺序存储与操作 (循环队列) 1 typedef int Position; 2 struct QNode { 3 ElementType *Data; // 存储元素的数组 4 Position Front, Rear; // 队列的 头.尾指针 5 int Cap; // 队列最大大容量 6 }; 7 typedef struct QNode *Queue; 8 9 // 操作集 10 Queue CreateQueue(int M

数据结构导论 四 线性表的顺序存储VS链式存储

前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char name[30];//姓名 char sex; //性别 int class;//班级 int age;//年龄 } student={"01",“zhangsan”,"m","201","20"}: 链式存储:初始化 //建立一个空链

C++栈的顺序存储和链式存储的实现

栈是最常见的数据结构,其特点是后进先出(Last In First Out)也是链表的特殊形式,所以和链表一样,有两种存储方式,第一是顺序存储的栈,方便快速读写数据,但是栈的长度必须先固定:第二种是链式存储的栈,可以不用定义栈的长度,可以大量插入数据,如果不是物理内存使用完的话,可以存储大量的数据. 首先,顺序存储的栈的实现,代码如下: #pragma once #define MAXSIZE 10 template<typename EleType> class OrderStack { p

数据结构学习笔记(二) 线性表的顺序存储和链式存储

线性表:由同类型数据元素构成有序序列的线性结构 -->表中元素的个数称为线性表的长度 -->没有元素时,成为空表 -->表起始位置称表头,表结束位置称表尾 顺序存储: 1 package test; 2 3 /** 4 * 线性表(数组) 5 * 6 */ 7 public class Test { 8 private static int m ; 9 private static int[] a; 10 public static void main(String[] args) {

线性表的顺序存储和链式存储

顺序存储是分配了一块连续的内存,把这块内存平均分为N份,每份存放一个线性表的单元.从内存利用角度讲,顺序存储需要的是一块连续的内存.特点是查找节点容易,插入. 删除节点比较耗时. 链式存储是分配了几个零散的非连续单元,从内存利用角度讲,它能充分利用那些碎片化的内存.特点是查找节点慢,但插入删除节点快. 怎么理解呢? 下文说的酒店均没有客户记录,就是没有登记某个人住在某个房间. 顺序存储就和某个酒店的一层房间,比如在第一层有100个房间,从1号房间按顺序一致排到底100号房间.你去找一个人,打开1

数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)

一,线性表顺序存储 #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <io.h> #include <math.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSI

C 数据结构1——线性表分析(顺序存储、链式存储)

之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug也不懂怎么修改,那个时候,电脑一直被我弄蓝屏,这个寒假,重新学习一遍数据结构,获益良多,整理一下,发布出来,求拍砖,共同进步. 线性表(List),0个或者多个数据元素的有限序列 线性表的顺序存储,即线性表通过数组的方式实现,指用一段地址连续的存储单元一次存储线性表的数据元素.如图: A1 A2 -

3-7-队列的链式存储-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 队列的链式存储 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h        相关测试数据下载  链接? 无数据    

线性表的链式存储结构——(2)

线性表的存储结构有两种:顺序存储和链式存储 顺序存储:读取数据的时间复杂度为O(1),其实就是数组,但是插入,删除的复杂度略大 链式存储:•用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置. 数据域:存储数据元素信息的域 指针域:把存储直接后继位置的域 指针或链:指针域中存储的信息 结点(Node):数据域和指针域组成数据元素称为存储映像 单链表:链表的每个结点中只包含一个指针域 •头指针 –头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点