数据结构(1)栈的自定义实现

栈和队列是最基础的数据结构,关于他们的特性和用法我们都已十分熟悉。今天我要描述的是如何自定义实现栈这种数据结构,这能够帮助我们深入地了解栈这种数据结构的原理,也能更好地研究其他数据结构类型。

概述:

自定义实现能够动态调整的泛型栈类型,并能够保持较好地性能。

实现:

1.首先我们实现的是一种定容泛型栈类型,此种栈创建后,大小固定,十分容易实现。

public class FixedCapacityStack<T>
    {
        private T[] a;
        private int N;
        public FixedCapacityStack(int cap)
        {

            a = new T[cap];
        }
        public bool isEmpty()
        {
            return N == 0;
        }
        public int Size()
        {
            return N;
        }
        public void Push(T item)
        {
            a[N++] = item;

        }
        public T Pop()
        {
            return a[--N];
        }}

这段C#代码成功实现了一个泛型栈,但是其容量是固定的,当他的大小远远小于或者大于容量时,就会造成内存资源浪费和异常。这就要求我们实现可变的,灵活地栈类型。

2.接下来我们实现可变容的泛型栈类型,这样我们就可以达到动态缩放其大小。

public class FixedCapacityStack<T>
    {
        private T[] a;
        private int N;
        public FixedCapacityStack(int cap)
        {

            a = new T[cap];
        }
        public bool isEmpty()
        {
            return N == 0;
        }
        public void Resize(int max)
        {
            T[] temp = new T[max];
            for (int i = 0; i < a.Length; i++)
                temp[i] = a[i];
            a = temp;
        }
        public int Size()
        {
            return N;
        }
        public void Push(T item)
        {
            if (N == a.Length) Resize(2 * a.Length);
            a[N++] = item;

        }
        public T Pop()
        {
            T item= a[--N];
            if (N>0&&N == a.Length / 4) Resize(a.Length / 2);
            return item;
        }
    }

3.进一步实现可迭代的栈类型,能够按照设计意图实现栈类型迭代的特性。 public class FixedCapacityStack<T>:IEnumerable

    {
        private T[] a;
        private int N;
        public FixedCapacityStack(int cap)
        {

            a = new T[cap];
        }
        public bool isEmpty()
        {
            return N == 0;
        }
        public void Resize(int max)
        {
            T[] temp = new T[max];
            int min=Min(a.Length,temp.Length);
            for (int i = 0; i < min; i++)
                temp[i] = a[i];
            a = temp;
        }
        public int Min(int x, int y)
        {
            if (x < y) return x;
            else return y;
        }
        public int Size()
        {
            return N;
        }
        public void Push(T item)
        {
            if (N == a.Length) Resize(2 * a.Length);
            a[N++] = item;

        }
        public T Pop()
        {
            T item= a[--N];            a[N]=null;
            if (N>0&&N == a.Length / 4) Resize(a.Length / 2);
            return item;
        }

        public IEnumerator GetEnumerator()
        {
            for (int i = a.Length-1; i >=0; i--)
            {
                yield return a[i];
            }
        }
    }

应用:
我们可以通过实际调用测试其实际运行效果,代码如下:

 class Program
    {
        static void Main(string[] args)
        {
           /* string testExpress = "(1+((2+3)*(4*5)))";
            Console.WriteLine(Evaluate(testExpress));*/
            FixedCapacityStack<string> s = new FixedCapacityStack<string>(100);
            for (int i = 0; i < 150; i++) s.Push(i.ToString());
            Console.WriteLine(s.Size());
            for(int j=0;j<120;j++) s.Pop();
            foreach (var item in s)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine(s.Size());
        }
}

至此我们实现了一个可迭代的可变容的范型栈类型,这样再来理解和使用栈类型,势必会有更清晰的认识。

class Program
    {
        static void Main(string[] args)
        {
           /* string testExpress = "(1+((2+3)*(4*5)))";
            Console.WriteLine(Evaluate(testExpress));*/
            FixedCapacityStack<string> s = new FixedCapacityStack<string>(100);
            for (int i = 0; i < 150; i++) s.Push(i.ToString());
            Console.WriteLine(s.Size());
            for(int j=0;j<120;j++) s.Pop();
            foreach (var item in s)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine(s.Size());
        }
}

这里我有一个问题,范型数组没法讲其值改为null么?这样也就没法进行Pop释放了,各位有解决办法的可以在下面评论中给出,谢谢。

时间: 2024-10-10 02:18:26

数据结构(1)栈的自定义实现的相关文章

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

数据结构之栈与队列

数据结构的有一个重要结构栈,栈这种数据结构就是满足先进后出的这种规则的数据结构就是栈,引用<大话数据结构>中的一个形象例子就是,子弹的弹夹,最先压入弹夹的子弹最后一个出弹夹,正好往一个栈里添加一个元素叫压栈.入栈,从栈里出来一个元素叫弹栈,出栈.指示器就叫栈帧. 栈图 现在就贴上代码: 栈的几个基本操作: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{

数据结构之栈定义及基本操作实现

终于有可以有时间写点数据结构的学习总结了,前段时间一直在紧张的忙一些项目,都没有空出时间来学习数据结构,现在终于可以稍微喘口气了,还是数据结构有意思,这两天看了点栈的东西,写下来总结一下,有错误的地方希望看到的朋友指出来,感激不尽. 根据学习,栈就是一种线性数据结构,栈的运算只能在表的一段进行,所以这种数据结构具有“后进先出”的特点. 接下来是栈的c语言实现.其中栈由一个top节点和bottom节点组成,这两个节点分别指向栈的顶部和底部.其中栈的组成结点是由结构体实现,结构体由数据库和指向下一个

简单数据结构之栈模拟

1 /************************************************************************************** 2 * Function : 模拟栈 3 * Create Date : 2014/04/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不得

Java数据结构之栈

package com.xingej.algorithm.datastructure.stack; /**  * 数据结构之栈Stack  *   * 以long类型为测试用例  *   * @author erjun 2017年12月4日 下午10:22:34  */ public class LongStack {     // 底层数据存储     private long[] arr; // 最大元素数量     private int maxSize; // 当前元素的指针     p

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

数据结构 - 顺序栈的实行(C语言)

数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好? 对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底. 我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度.同理

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip

[数据结构]单调栈的基本应用2

[数据结构]单调栈的基本应用2 一.前言 单调栈的基本应用2是单调栈的基本应用1的延伸.应用2主要解决的是二维平面的一些问题. 二.基本应用2 虽然已经应用到二维平面,但是单调栈的思想并没有变化 更多应用的是延伸的位置.本质是ai的左/右第一个大于ai的元素位置 下面列举的一些平面内单调栈的例题: 例1: POJ2559 最大矩形面积 题目描述: 给定n个依次排列并且面积为1*hi的矩形,现求这个图形所包含最大的矩形的面积. 上图中7个矩形的h依次为2 1 4 5 1 3 3.注意题目有多组数据