12. C#数据结构与算法 -- 顺序栈

理论基础:

栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。

栈可以分为顺序栈和链栈。

用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(Sequence Stack)。类似于顺序表,用一维数组来存放顺序栈中的数据元素。栈顶指示器top设在数组下标为0的端,top随着插入和删除而变化,当栈为空时,top=-1。

链栈通常用单链表来表示,它的实现是单链表的简化。所以,链栈结点的结构与单链表结点的结构一样。由于链栈的操作只是在一端进行,为了操作方便,把栈顶设在链表的头部,并且不需要头结点。

C#中的栈:

C#2.0以下版本只提供了非泛型的Stack类,该类继承了ICollection、IEnumerable和ICloneable接口。

C#2.0提供了泛型的Stack<T>类,该类继承了IEnumerable<T>、ICollection和IEnumerable接口,关于泛型Stack<T>类的更具体的信息,读者可参考.NET Framework的有关书籍。

c#本身已经写好 了栈和队列,我们可以直接用,这里自己实现以下,就是为了更深刻的理解。

栈通常记为:S=
(a1,a2,…,an),S是英文单词stack的第1个字母。栈中元素按a1,a2,a3,...,an的次序进栈,出栈的次序为栈顶元素。即出栈的次序与进栈相反,an第一个出栈,a1最后一个出栈。所以,栈的操作是按照后进先出(Last
In First Out,简称LIFO)或先进后出(First In Last
Out,简称FILO)的原则进行的,因此,栈又称为LIFO表或FILO表。

对于栈来说,主要的操作有:

1、构造空栈

2、清空栈:ClearStack()

3、求栈长(获得栈中元素的个数):StackLength()

4、返回栈顶元素:GetTop()

5、压栈操作:Push(object e)

6、弹栈操作(出栈操作):Pop()

7、判断栈是否为空:IsEmpty()

8、判断栈是否已满:IsFull()

实例:

using System;
 
class Stack
{
    int maxsize;        //顺序栈的容量
    object[] data;      //数组,用于存储栈中的数据
    int top;            //指示栈顶
 
    public object this[int index]
    {
        get{return data[index];}
        set{ data[index] = value;}
    }
    //栈容量属性
    public int Maxsize
    {
        get
        {
            return maxsize;
        }
        set
        {
            maxsize = value;
        }
    }
    //获得栈顶的属性
    public int Top
    {
        get
        {
            return top;
        }
    }
    //使用构造器初始化栈
    public Stack(int size)
    {
        data = new object[size];
        maxsize = size;
        top = -1;
    }
    //求栈的长度(栈中的元素个数)
    public int StackLength()
    {
        return top+1;
    }
    //清空顺序栈
    public void ClearStack()
    {
        top = -1;
    }
    //判断顺序栈是否为空
    public bool IsEmpty()
    {
        if (top == -1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //判断顺序栈是否为满
    public bool IsFull()
    {
        if (top == maxsize-1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //入栈操作
    public void Push(object e)
    {
        if(IsFull())
        {
            Console.WriteLine("栈已满!");
            return;
        }
        data[++top] = e;
    }
    //出栈操作,并返回出栈的元素
    public object Pop()
    {
        object temp = null;
        if (IsEmpty())
        {
            Console.WriteLine("栈为空!");
            return temp;
        }
        temp = data[top];
        top --;
        return temp;
    }
    //获取栈顶数据元素
    public object GetTop()
    {
        if (IsEmpty())
        {
            Console.WriteLine("栈为空!");
            return null;
        }
        return data[top];
    }
}
 
//定义测试类
class Test
{
    static void Main()
    {
        Stack s = new Stack(10);
        Random r = new Random();     //随机生成数据
        int mid;
        for(int i = 0;i<10;i++)
        {
            mid = (int)r.Next(10,100);    //获取10~100之间的整型数据
            s.Push(mid);         //将数据压栈
            Console.WriteLine("将数据{0}压栈,现在栈中元素数为:{1}",
                mid,s.StackLength());
        }
        Console.WriteLine("\n准备将数据元素888压栈:");
        s.Push(888);
 
        Console.WriteLine("栈中元素个数为:{0}",s.StackLength());
        Console.WriteLine();
        for(int j = 0;j<10;j++)//循环出栈
        {
            Console.WriteLine("将数据{0}弹栈,现在栈中元素数为:{1}",
                s.Pop(),s.StackLength());
        }
    }
}

实例2: 下面的实例演示了堆栈(Stack)的使用:

using System;
using System.Collections;
namespace CollectionsApplication
{
    class Program
{
        static void Main(string[] args)
{
            Stack st = new Stack();
            st.Push(‘A‘);
            st.Push(‘M‘);
            st.Push(‘G‘);
            st.Push(‘W‘);
            Console.WriteLine("Current stack: ");
            foreach (char c in st)
{
                Console.Write(c + " ");
}
            Console.WriteLine();
            st.Push(‘V‘);
            st.Push(‘H‘);
            Console.WriteLine("The next poppable value in stack: {0}",
st.Peek());
            Console.WriteLine("Current stack: ");
            foreach (char c in st)
{
                Console.Write(c + " ");
}
            Console.WriteLine();
            Console.WriteLine("Removing values ");
st.Pop();
st.Pop();
st.Pop();
            Console.WriteLine("Current stack: ");
            foreach (char c in st)
{
                Console.Write(c + " ");
}
            Console.ReadLine();
}
}
}
////当上面的代码被编译和执行时,它会产生下列结果:
//Current stack:
//W G M A
//The next poppable value in stack: H
//Current stack:
//H V W G M A
//Removing values
//Current stack:
//G M A

参考:
http://www.cnblogs.com/Richet/archive/2008/10/16/1313045.html 
http://www.w3cschool.cc/csharp/csharp-stack.html 
http://blog.163.com/fujl_2008/blog/static/10378107200810972618942/

时间: 2024-08-04 20:16:57

12. C#数据结构与算法 -- 顺序栈的相关文章

数据结构与算法——顺序栈

今天总结栈的顺序存储结构 什么是栈? 栈是一种线性表,其特点是限定尽在表尾进行插入和删除操作,表尾栈一段也叫栈顶,另一端就是栈底了.既然栈是线性表,那么栈也就有两种存储数据的方式,顺序存储和链式存储.今天实现的是顺序存储的栈,也就顺序栈. 图示(来自百度图片): 顺序栈的实现: 栈的顺序存储还是比较简单的,就是对数组进行操作. <span style="font-family:Courier New;font-size:14px;">#include <iostrea

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

java数据结构与算法之栈(Stack)设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53362993 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 ??本篇是jav

数据结构与算法之栈

前言:我也是即学即写的,难免有错误.欢迎之处这篇博文的不足之处. 一.什么是栈? 栈是数据结构的一种,他的原理就是后进先出(先进后出是一样的道理),如图(无图言屌) 看到没,你如果把栈当成一个开口向上的容器的话,你最先存储的a1要想取出来,必须把上面的元素都取出来,而你最后一个存储的a5元素却可以第一个取出来.这就是后进先出. PS:我这里的top是指向栈顶元素的,这里用到的top初值是-1.有的书中(好像是严蔚敏的)的top的初始值是0.所以top指向栈顶元素的上一个存储单元.我个人觉得还是t

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很

数据结构C语言—顺序栈案例—十进制转二进制

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "SeqStack.h" 4 5 void conversion(int); 6 SeqStack seq; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 conversion(n); 12 return 0; 13 } 14 15 void conversion(int N)

数据结构与算法JavaScript 栈(一)

数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录下来吧 git代码下载:https://github.com/JsAaron/data_structure.git 栈结构 特殊的列表,栈内的元素只能通过列表的一端访问,栈顶 先入先出(LFIO,last-in-first-out)的数据结构 javascript提供可操作的方法, 入栈 push, 出

数据结构:C_顺序栈的实现

数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typedef struct { int *base; int *top; int stacksize; }SqStack; |说明: 1.base表示栈底指针,在判断出栈.初始化和重新分配空间的时候需要用到. 2.top表示栈顶指针,是栈最关键和核心的组成,入栈时top向上移动,出栈时top向下移动. 3.此

数据结构基础(6) --顺序栈的设计与实现

栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一种后进先出(last-in, first-out)的策略;类似的, 在队列中, 可以去掉的元素总是在集合中存在时间最长的那一个:队列实现了先进先出(first-in, first-out)的策略[下一篇我们着重复习队列]. 栈的示意图: //顺序栈的实现与解析 template <typename