C# 数组集合<三> 顺序栈和链栈
来源:互联网 发布:2017微信秒余额源码 编辑:程序博客网 时间:2024/04/29 23:15
概念:
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
我们通常说堆栈那么其实他俩并非一个概念,我们从编译程序占用的内存分配来了解一下。
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap)— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放。
文字常量区(CONST)—常量字符串就是放在这里的。 程序结束后由系统释放.
程序代码区(Program)—存放函数体的二进制代码。
顺序栈(SequenceStack):用一片连续的存储空间来存储栈中的数据元素。类似于顺序表,用一维数组来存放栈中的数据元素。缺点:浪费存储空间。
链栈(LinkedStack):用链式存储结构来存储的栈.链栈通常用单链表来表示。
C#下代码的实现:
公共接口:
IStack:
internal interface IStack<T> { void Push(T item); T Pop(); T GetTop(); int GetLength(); bool IsEmpty(); void Clear(); }
顺序栈:
/* * 顺序栈 * */namespace Data_Structure_Demo{ using System; public class SequenceStack<T> : IStack<T> { //栈的容量 //用于存储栈中数据元素 private readonly T[] stackData; private int stackSize; //栈顶元素index private int stackTop; /// <summary> /// 构造函数 初始化一个顺序栈 给定存储空间 栈元素为空 /// </summary> /// <param name="size"></param> public SequenceStack(int size) { this.stackData = new T[size]; this.stackSize = size; this.stackTop = -1; } public T this[int index] { get { return this.stackData[index]; } set { this.stackData[index] = value; } } public int StackSize { get { return this.stackSize; } set { this.stackSize = value; } } public int StackTop { get { return this.stackTop; } } public int GetLength() { return this.stackTop + 1; } public void Clear() { this.stackTop = -1; } public bool IsEmpty() { if (this.stackTop == -1) { return true; } return false; } public void Push(T value) { if (this.IsFull()) { Console.WriteLine("Stack is Full!(SB 栈都满了还往里怼!)"); } this.stackData[++this.stackTop] = value; } public T Pop() { T value = default(T); if (this.IsEmpty()) { Console.WriteLine("Stack is Empty!(si bu si sa 都没了取个鸡毛!)"); return default(T); } value = this.stackData[this.stackTop]; --this.stackTop; return value; } public T GetTop() { if (this.IsEmpty()) { Console.WriteLine("Stack is Empty !(si bu si sa 都没了取个鸡毛!)"); return default(T); } return this.stackData[this.stackTop]; } public bool IsFull() { if (this.stackTop == this.stackSize - 1) { return true; } return false; } }}
链栈:
链栈节点
LinkStackNode:
public class LinkStackNode<T> { //数据域 //引用域 public LinkStackNode() { this.Data = default(T); this.Next = null; } public LinkStackNode(T val) { this.Data = val; this.Next = null; } public LinkStackNode(T val, LinkStackNode<T> p) { this.Data = val; this.Next = p; } //数据域属性 public T Data { get; set; } //引用域属性 public LinkStackNode<T> Next { get; set; } }
链栈实现:
public class LinkStack<T> : IStack<T> { private LinkStackNode<T> top; //栈顶指示器 private int size; //栈中元素的个数 //栈顶指示器属性 public LinkStackNode<T> Top { get { return top; } set { top = value; } } //元素个数属性 public int Size { get { return size; } set { size = value; } } public LinkStack() { top = null; size = 0; } //判断链栈是否为空 public bool IsEmpty() { if ((top == null) && (size == 0)) return true; else return false; } public int GetLength() { return size; } public void Clear() { top = null; size = 0; } //入栈操作 //在单链表的起始处插入一个结点 public void Push(T item) { LinkStackNode<T> q = new LinkStackNode<T>(item); if (top == null) { top = q; } else { //将新结点的next指向栈顶指示器top所指向的结点 q.Next = top; //将栈顶指示器top指向新结点 top = q; } ++size; } //出栈操作 public T Pop() { if (IsEmpty()) { Console.WriteLine("Stack is empty !"); return default(T); } LinkStackNode<T> p = top; top = top.Next; --size; return p.Data; } //获取栈顶结点的值 public T GetTop() { if (IsEmpty()) { Console.WriteLine("Stack is empty !"); return default(T); } return top.Data; } }
这里没有贴出测试代码!我将会把所有类型的基本实现写完之后,会利用这些结构编写一些经典算法来实战。
0 0
- C# 数组集合<三> 顺序栈和链栈
- C#数组和集合
- C#集合和数组
- 实验三 顺序栈和链栈
- 实验三、顺序栈和链栈
- 数组和集合(三)
- C#实现顺序栈和链栈
- 【C#基础】数组和集合
- C#学习笔记三 数组、集合、哈希表
- 数组和集合对象(三) ArrayList练习
- c#数组类和集合类
- 【C#学习】——集合和数组
- C#学习日记-数组和集合
- 实验三:顺序栈和链队列验证实验
- C# 代码实现 顺序栈和链栈
- 顺序栈-数组实现
- C#数据结构(三)----串和数组
- 关于C#中集合和数组(三)
- iOS开发UI篇—核心动画(基础动画)
- linux删除空行
- C++中的显式构造函数
- 在SWIFT中应该采用什么样的方式来定义这个链表中的节点呢?附Class和Struct的不同
- iOS开发UI篇—核心动画(关键帧动画)
- C# 数组集合<三> 顺序栈和链栈
- 重装mysql安装最后一项的apply security settings 总是不能进行。提示error nr.1045然后就是access denied for user 'root' @'loc
- 在Android加入和使用Realm
- Java Web项目启动时提示UnknownHostException
- iOS使用约束实现动画效果
- Ubuntu Hadoop伪分布式搭建
- iOS开发UI篇—核心动画(转场动画和组动画)
- POI2010 Intelligence Test
- HTML标签对学习