数据结构学习---堆栈的动态数组实现及链表实现

堆栈

【链表实现堆栈】

优点:可以无限增添元素,只要内存足够,

缺点:内存中存储位置不连续

typedef int ElementType;
//只能向头部插入元素,因为如果在尾部插入,删除时,找不到上一个节点/
//因为链表是单向的
//所以 push pop 操作在头结点进行
class Stack{
	public:
		Stack(){
			S=(Stack*)malloc(sizeof(Stack)); //建立一个不存数据的头结点,方便增删节点
			S->Next=NULL;
			sz=0;
		}
		bool empty(){
			return (S->Next==NULL);
		}
		int size(){
			return sz;
		}
		void push(ElementType X){
			Stack* TmpCell=(Stack*)malloc(sizeof(Stack));
			TmpCell->Date=X;
			TmpCell->Next=S->Next;  //在头部增添节点
			S->Next=TmpCell;
			sz++;
		}
		ElementType pop(){
			Stack* FirstCell; //因为只是用了指向头结点,所以并不需要分配空间
			ElementType TopElem;
			if(empty()){
				cout<<"堆栈空"<<endl; return -1;
			}
			else{
				sz--;
				FirstCell=S->Next;
				TopElem=FirstCell->Date;
				S->Next=FirstCell->Next;
				free(FirstCell); //释放内存
				return TopElem;
			}
		}
	private:
		int Date;
		Stack* Next;
		Stack* S;
		int sz;//记录栈中元素个数
}stack;

【动态数组实现堆栈】

好处:申请了连续的内存空间,而且可以无限增添元素(内存足够)

初始化用malloc函数为动态数组分配maxn个空间,

s=(ElementType*)malloc(maxn*sizeof(ElementType));

如果数组满了,用realloc函数,重新分配空间,多分配一个maxn;

 if(Top+1>=maxn*N){ //如果当前栈中元素总量已满, 则重新申请空间,增加maxn个空间
      N++;
      s=(ElementType*)realloc(s,N*maxn*sizeof(ElementType));
 }

整体代码

const int maxn = 10;
typedef int ElementType;
class Stack{
    public:
        Stack(){
            s=(ElementType*)malloc(maxn*sizeof(ElementType));
            Top=-1; //因为希望元素从下标0开始储存,将Top置为-1
            N=1;
        }
        bool empty(){
            return (Top==-1);
        }
        int size(){
            return Top+1;
        }
        void push(ElementType X){
            if(Top+1>=maxn*N){ //如果当前栈中元素总量已满, 则重新申请空间,增加maxn个空间
                N++;
                s=(ElementType*)realloc(s,N*maxn*sizeof(ElementType));
            }
            s[++Top]=X;
        }
        ElementType pop(){
            if(empty()){
                cout<<"堆栈空"<<endl; return -1;
            }
            else {
                return s[Top--];
            }    
        }
    private:
        int Top; //记录栈顶位置
        int Date;
        int N;  //记录申请了几倍的maxn
        ElementType* s;
}stack;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 10:18:12

数据结构学习---堆栈的动态数组实现及链表实现的相关文章

算法与数据结构基础1:动态数组

恶补算法与数据结构,从很基础的开始,先看动态数组的实现. // array.h #include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Array { public: // ************************************************************************** // 类的四大函数:构造函数.拷贝构

数据结构学习(一)数组

数组回顾: 一.创建数组 1.创建数组 int[] arr=new int[10]; 创建一个长度为10的int类型的数组 long[] array=new long[10]; 创建long类型的数组 2.往数组中增加元素 arr[0]=1; 往数组的0元素的位置增加一个元素1 二.访问数组中的数据 int i=arr[0]; 从数组中获取0元素的数组 三.数组初始化 long[] arr=new long[]{2,3,4}//初始化arr[0]=1//修改值System.out.println

数据结构学习总结(2) 线性表之单链表

一,回忆链表 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的. 例如,使用链表存储 {1,2,3},数据的物理存储状态如图 1 所示: 图 1 链表随机存储数据 我们看到,图 1 根本无法体现出各数据之间的逻辑关系.对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素.如图 2 所示: 图 2 各数据元素配备指针 像图 2 这样

通用型动态数组的总结

基本数据结构之-通用型动态数组 动态数组的应用主要是对于长度未知的数组,先开辟一段空间来存储数据,当空间不够时,在开辟两倍的空间来存储数据 和普通数组的区别就是,我们可以不用关心数组的长度的问题,唯一需要关注的就是数据的类型是自定义数据类型还是基本数据类型,但是不论是基本数据类型还是自定义的数据类型,都需要自定义两个函数,这两个函数时遍历(打印)函数和比较函数,因为,在传递的是地址,没法再里面判断是什么类型,只能交给使用者去定义它的想关的函数, 先说基本的结构: 为了适应更多的数据类型,我们存储

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

int型动态数组总结

简单的数据结构之-int型动态数组 这个貌似没有参考可以借鉴,如果哪位有幸看到,请您给我说一下哈!再次感谢各位了! 想关的参看的资料来自某培训机构,我是参照动态数组写的 想关的介绍文章 C语言中文网:http://c.biancheng.net/cpp/html/2790.html 数组都有一个固定的长度,超出它的长度就无法再添加新的元素,但是动态数组可以动态的增加数组的长度,可以无限的插入数据. // 动态数组是一个不存在的数据类型,所以需要定义一个结构体来说明动态数组的类型,数组需要空间存储

[C] 在 C 语言编程中实现动态数组对象

对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态数组. /* Author: [email protected] */ 基本的 C 数组 C 语言编程中声明一个基本数组如下: int main() { // 声明一个容纳 3000 个整数的数组 int my_array[3000]; } 以上代码做了两件事: ● 在栈区开辟内存空间.准确说来是在

小猪的数据结构学习笔记(三)

小猪的数据结构学习笔记(三) 线性表之单链表 本章引言: 上一节中我们见识了第一个数据结构--线性表中的顺序表; 当你把操作的代码自己写几遍就会有点感觉了,如果现在让你写顺序表的 插入算法,你能够想出大概的代码么?如果可以,那么你就可以进入新的章节了; 否则,还是回头看看吧!在本节,我们将迎来线性表的链式表示--单链表 单链表和顺序表有什么优势和劣势呢?单链表的头插法和尾插法有什么不同呢? 请大家跟随笔者的脚步来解析线性表中的单链表把! 本节学习路线图 路线图解析: ①先要理解顺序表和单链表各自

nginx学习七 高级数据结构之动态数组ngx_array_t

1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存.但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息,并且可以动态增长.下面 我们从数组的定义上来详细的了解一下.ngx_array_t的定义位于src/core/ngx_array.c|h里面. struct ngx_array_s { void *elts;//数组的首地址 ngx_