【C#】【数据结构】006-栈:链栈
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-栈:链栈的更多相关文章
- 数据结构——Java实现链栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...
- 顺序栈,链栈,队列java实现
顺序栈 /** * 顺序栈 * */ public class SqStack { //栈的大小 private int maxSize; //栈顶指针 private int top; privat ...
- java与数据结构(6)---java实现链栈
栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...
- c/c++ 链栈
c/c++ 链栈 链栈 下面的代码实现了以下功能 函数 功能描述 push 压入 pop 弹出 show_list 打印 clear 释放所有内存空间 destroy 释放所有内存空间 nodesta ...
- 数据结构 - 链栈的实行(C语言)
数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...
- 数据结构——链栈(link stack)
/* linkStack.c */ /* 链栈 */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h ...
- 数据结构实验3:C++实现顺序栈类与链栈类
实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...
- C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)
/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...
- 数据结构 - 链栈的实现 C++
链栈封装 C++ 使用C++对链栈进行了简单的封装,实现了栈的基本操作 封装方法: pop(),top(),size(),empty(),push() 代码已经过测试 #pragma once #in ...
随机推荐
- jmeter(二十二)jmeter测试Java请求
目的:对Java程序进行测试 目录 一.核心步骤 二.实例 三.JMeter Java Sampler介绍 四.自带Java Request Sampler 一.核心步骤 1.创建一个Java工程: ...
- css新奇技术及其未来发展
1.图像替换技术: 图像替换技术是指使用图像替换页面中文本的功能,类似与在页面中插入图像,只是这种方法更为方便,易于代码管理.通常来说,设计者习惯使用有意义的图像去替换一些标题,logo和某些特定的页 ...
- Git命令---递归克隆
git clone --recursive https://github.com/rbgirshick/fast-rcnn.git Git命令 --recursive 会递归克隆fast-rcnn项目 ...
- zoj3772Calculate the Function(矩阵+线段树)
链接 表达式类似于斐波那契 但是多了一个变量 不能用快速幂来解 不过可以用线段树进行维护 对于每一个点够一个2*2的矩阵 1 a[i] 1 0 这个矩阵应该不陌生 类似于构造斐波那契的那个数列 ...
- 【学习笔记】深入理解js原型和闭包(18)——补充:上下文环境和作用域的关系
本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 0 ...
- iOS html格式解析
使用TFHpple解析html https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 ...
- Android获取声音长度
代码 MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); metaRetriever.setDataSource( ...
- ssm框架搭建(下) 简单案例
前言 这段时间没有更新博客,一直想做一个基于ssm的简单的项目.经过多次的尝试,终于实现了简单的增删查改功能了. 正文 由于前端的技术不是很熟悉,经过多方的查阅,使用了bootstrap的样式,来使界 ...
- (转)使用Spring配置文件实现事务管理
http://blog.csdn.net/yerenyuan_pku/article/details/52886207 前面我们讲解了使用Spring注解方式来管理事务,现在我们就来学习使用Sprin ...
- pagehelper 分页
分页jar包: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pa ...
