C# 数组集合<三> 顺序栈和链栈
2016-09-28 13:27
232 查看
概念:
栈(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
a9a6
{
//将新结点的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;
}
}
这里没有贴出测试代码!我将会把所有类型的基本实现写完之后,会利用这些结构编写一些经典算法来实战。
相关文章推荐
- C#中 ArrayList与string,string[],List<string> 数组集合转换
- C# List<T> 数组,集合等排序
- C# 数组集合<二> 双向链表和双向循环链表
- C# 数组集合 <一>基本概念(Array&ArrayList&List<T>&SortList&LinkList的实现Code)
- .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
- C#.Net:List<T>集合列表的Linq语句查询示例
- .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
- C#中string[]数组和list<string>泛型的相互转换 【转】
- C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
- c# 泛型集合Dictionary<TKey,TValue>
- C#中string[]数组和list<string>泛型的相互转换
- C#中string[]数组和list<string>泛型的相互转换 【转】
- 短信猫软件的实现(C#)<三>PDU格式短信解析
- 短信猫软件的实现(C#)<三>PDU格式短信解析(转)
- c# 泛型集合Dictionary&lt;TKey,TValue&gt;
- C#中string[]数组和list<string>泛型的相互转换 【转】
- 实战BULK COLLECT(成批聚合类型)和数组集合type 类型 <转>
- C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
- C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
- C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合