C#数据结构:链栈

  • 1、自定义链栈结构:
  • 链栈节点类
using System.Collections;
using System.Collections.Generic;
using UnityEngine; /// <summary>
/// 链栈节点类
/// </summary>
/// <typeparam name="T"></typeparam>
public class LinkStackNode<T>
{
private T data;//数据 private LinkStackNode<T> next; //指针,下个元素 public T Data
{
get
{
return data;
} set
{
data = value;
}
} public LinkStackNode<T> Next
{
get
{
return next;
} set
{
next = value;
}
} public LinkStackNode()
{
this.data = default(T);
this.next = null;
} public LinkStackNode(T _data, LinkStackNode<T> _next)
{
this.data = _data;
this.next = _next;
} public LinkStackNode(T _data)
{
this.data = _data;
this.next = null;
} public LinkStackNode(LinkStackNode<T> _next)
{
this.next = _next;
this.data = default(T);
} }

  • 链栈类
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class LinkStack<T>
{
private LinkStackNode<T> top;//栈顶头指针 private int count;//栈中元素个数 public int Count
{
get
{
return count;
} set
{
count = value;
}
} //初始化栈
public LinkStack()
{
top = new LinkStackNode<T>();
count = 0;
} //判栈空
public bool IsEmpty()
{
return (Count == 0)&&(top.Next==null);
} //进栈
public void Push(T item)
{
LinkStackNode<T> newNode = new LinkStackNode<T>(item);
if(newNode==null)
{
return;
}
newNode.Next = top.Next;
top.Next = newNode;
Count++;
} //出栈
public T Pop()
{
if(IsEmpty())
{
throw new System.Exception("栈空,无法出栈!");
}
LinkStackNode<T> currentTopNode = top.Next;
top.Next = currentTopNode.Next;
Count--;
return currentTopNode.Data;
} //访问栈顶元素
public T Peek()
{
if (IsEmpty())
{
throw new System.Exception("栈空,无法访问栈顶!");
}
return top.Next.Data;
} //清空栈
public void Clear()
{
top.Next=null;
Count = 0;
} }

  • 链栈测试用例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class _006_LinkStack : MonoBehaviour
{ LinkStack<string> linkStack; void Start()
{
//初始化链栈
linkStack = new LinkStack<string>(); //判空
Debug.Log("链栈是否空:" + linkStack.IsEmpty()); //进栈
Debug.Log("进栈:" + "1,2,3,4");
linkStack.Push("1");
linkStack.Push("2");
linkStack.Push("3");
linkStack.Push("4"); //判空
Debug.Log("链栈是否空:" + linkStack.IsEmpty()); //栈中元素个数
Debug.Log("链栈中元素个数: " + linkStack.Count); //出栈
Debug.Log("出栈-----出栈值为:" + linkStack.Pop()); //栈中元素个数
Debug.Log("出栈后,链栈中元素个数: " + linkStack.Count); //访问栈顶元素
Debug.Log("链栈顶元素值: " + linkStack.Peek()); //栈中元素个数
Debug.Log("访问链栈顶后,链栈中元素个数: " + linkStack.Count); //清空栈
linkStack.Clear();
Debug.Log("清空链栈!"); //栈中元素个数
Debug.Log("清空链栈后,栈中元素个数: " + linkStack.Count);
} }

输出结果:

注意:

1、链栈即采用链表作为存储结构实现的栈。为便于操作,这里采用带头结点的单链表实

现栈。由于栈的插入和删除操作仅限制在表头位置进行,所以链表的表头指针就作为栈顶指

针,如下图所示。

2、在上图中,top 为栈顶指针,始终指向当前栈顶元素前面的头结点。若 top->next=NULL,

则代表栈空。采用链栈不必预先估计栈的最大容量,只要系统有可用空间,链栈就不会出现

溢出。采用链栈时,栈的各种基本操作的实现与单链表的操作类似,对于链栈,在使用完毕

时,应该释放其空间。

【C#】【数据结构】006-栈:链栈的更多相关文章

  1. 数据结构——Java实现链栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...

  2. 顺序栈,链栈,队列java实现

    顺序栈 /** * 顺序栈 * */ public class SqStack { //栈的大小 private int maxSize; //栈顶指针 private int top; privat ...

  3. java与数据结构(6)---java实现链栈

    栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...

  4. c/c++ 链栈

    c/c++ 链栈 链栈 下面的代码实现了以下功能 函数 功能描述 push 压入 pop 弹出 show_list 打印 clear 释放所有内存空间 destroy 释放所有内存空间 nodesta ...

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

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

  6. 数据结构——链栈(link stack)

    /* linkStack.c */ /* 链栈 */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h ...

  7. 数据结构实验3:C++实现顺序栈类与链栈类

      实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...

  8. C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

    /**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...

  9. 数据结构 - 链栈的实现 C++

    链栈封装 C++ 使用C++对链栈进行了简单的封装,实现了栈的基本操作 封装方法: pop(),top(),size(),empty(),push() 代码已经过测试 #pragma once #in ...

随机推荐

  1. CI框架错误汇总

    2017年1月13日12:09:02 [1] A PHP Error was encounteredSeverity: NoticeMessage: Undefined variable: aticl ...

  2. div里面放img

    div里面放img的时候 会出现包裹不住的情况,这个时候 只要将img { width:100%,height:100%  },就可以解决问题了

  3. 学习JavaScript数据结构与算法 (二)

    学习JavaScript数据结构与算法 的笔记 包含第四章队列, 第五章链表 本人所有文章首发在博客园: http://www.cnblogs.com/zhangrunhao/ 04队列 实现基本队列 ...

  4. Linux在线安装pip和numpy

    最近写Python需要用到numpy包 运行pip install numpy就会自动安装 一.因此需要先安装pip 1.如果安装的是Python>=2.7.9或者Python>=3.4, ...

  5. C#实现为类和函数代码自动添加版权注释信息的方法

    这篇文章主要介绍了C#实现为类和函数代码自动添加版权注释信息的方法,主要涉及安装文件的修改及函数注释模板的修改,需要的朋友可以参考下   本文实例讲述了C#实现为类和函数代码自动添加版权注释信息的方法 ...

  6. leetcode410 Split Array Largest Sum

    思路: dp. 实现: class Solution { public: int splitArray(vector<int>& nums, int m) { int n = nu ...

  7. linux的top下buffer与cache的区别

    buffer:    缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据 的区域.通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据 时,速度快的设备的操作进程不发 ...

  8. loadrunner:文本检查点web_reg_find和web_find两个函数的区别

    web_reg_find是先注册(register)后查找的:使用时将它放在请求语句的前面. 而web_find是查找前面的请求结果:使用时将它放在请求语句的后面. 另二者的参数也完成不一样的,web ...

  9. iOS8扩展插件开发配置

    一.iOS8扩展插件概述 WWDC14除了发布了OS X v10.10和switf外,iOS8.0也开始变得更加开放了.说到开放,当然要数应用扩展(App Extension)了.顾名思义,应用扩展允 ...

  10. python的特殊数字类型(无穷大、无穷小等)

    float('inf') 表示正无穷 -float('inf') 或 float('-inf') 表示负无穷 其中,inf 均可以写成 Inf 起步python中整型不用担心溢出,因为python理论 ...