zoukankan      html  css  js  c++  java
  • 简单数据结构(三)栈

    后进先出结构:栈

    栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶( Top),另一端是固定的,叫栈底( Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。
    栈通常记为: S= (a1,a2,…,an),S是英文单词stack的第 1 个字母。a1为栈底元素,an为栈顶元素。这n个数据元素按照a1,a2,…,an的顺序依次入栈,而出栈的次序相反,an第一个出栈,a1最后一个出栈。所以,栈的操作是按照后进先出(Last In First Out,简称LIFO)或先进后出(First In Last Out,简称FILO)的原则进行的,因此,栈又称为LIFO表或FILO表。栈的操作示意图如图所示。

    image

    BCL中的栈

    C#2.0 一下版本只提供了非泛型的Stack类(存储object类型)

    C#2.0 提供了泛型的Stack<T>类

    重要的方法如下

    1,Push()入栈(添加数据)
    2,Pop()出栈(删除数据,返回被删除的数据)
    3,Peek()取得栈顶的数据,不删除
    4,Clear()清空所有数据
    5,Count取得栈中数据的个数

    程序操作:

                //1.使用BCL中的Stsck 栈类
                Stack<char> stack=new Stack<char>();
                //2.使用我们自己的顺序栈
                //IStackDS<char> stack=new SeqStack<char>(30);
                //3.使用我们自己的链栈
                //IStackDS<char> stack=new LinkStackle<char>();
    
                stack.Push('a');
                stack.Push('b');
                stack.Push('c');
                Console.WriteLine("push a b c之后的数据个数为:" + stack.Count);
                char temp = stack.Pop();//取得栈顶数据,并把它删除
                Console.WriteLine("pop之后得到的数据为"+temp);
                Console.WriteLine("pop之后的数据个数为:" + stack.Count);
                char temp2 = stack.Peek();//取得栈顶数据,不删除
                Console.WriteLine("peek之后得到的数据为" + temp2);
                Console.WriteLine("peek之后的数据个数为:" + stack.Count);
    
                stack.Clear();
                Console.WriteLine("clear之后的数据个数为:" + stack.Count);
    
                Console.ReadKey();

    结果显示:

    image


    自己实现的栈:

    栈的接口定义:

    interface IStackDS<T>
        {
            int Count { get; }//栈内数量
            int GetLength();//求栈的长度
            bool IsEmpty();//判断栈是否为空
            void Clear();//清空操作
    
            void Push(T item);//入栈操作
    
            T Pop();//出栈操作
            T Peek();//取栈顶元素
        }

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


    image

    程序实现:

    class SeqStack<T>:IStackDS<T>
        {
            private T[] data;
            private int top;
    
            public SeqStack(int size)
            {
                data = new T[size];
                top = -1;
            }
            public SeqStack() : this(10)
            {
            }
            public int Count 
            {
                get { return top + 1; }
            }
            public int GetLength()
            {
                return Count;
            }
            public bool IsEmpty()
            {
                return Count == 0;
            }
            public void Clear()
            {
                top = -1;
            }
            public void Push(T item)
            {
                data[top + 1] = item;
                top++;
            }
            public T Pop()
            {
                T temp = data[top];
                top--;
                return temp;
            }
            public T Peek()
            {
                return data[top];
            }
        }

    链栈:栈的另外一种存储方式是链式存储,这样的栈称为链栈(Linked Stack)。链栈通常用单链表来表示,它的实现是单链表的简化。所以,链栈结点的结构与单链表结点的结构一样,如图 3.3 所示。由于链栈的操作只是在一端进行,为了操作方便,把栈顶设在链表的头部,并且不需要头结点。

    image

    链栈结点实现:

    class Node<T>
        {
            private T data;
            private Node<T> next;
    
            public Node()
            {
                data = default(T);
                next = null;
            }
            public Node(T data)
            {
                this.data = data;
                next = null;
            }
            public Node(T data, Node<T> next)
            {
                this.data = data;
                this.next = next;
            }
            public Node(Node<T> next)
            {
                this.next = next;
                data = default(T);
            }
            public T Data 
            {
                get { return data; }
                set { data = value; }
            }
            public Node<T> Next 
            {
                get { return next; }
                set { next = value; }
            }
        }

    程序实现:

    class LinkStackle<T>:IStackDS<T>
        {
            private Node<T> top;//栈顶元素节点
            private int count = 0;//栈中元素的个数
    
            public int Count
            {
                get { return count; }
            }
            public int GetLength()
            {
                return count;
            }
            public bool IsEmpty()
            {
                return count == 0;
            }
            public void Clear()
            {
                count = 0;
                top = null;
            }
            public void Push(T item)
            {
                //把新添加的元素作为头节点(栈顶)
                Node<T> newNode=new Node<T>(item);
                newNode.Next = top;
                top = newNode;
                count++;
            }
            public T Pop()
            {
                T data = top.Data;
                top = top.Next;
                count--;
                return data;
            }
            public T Peek()
            {
                return top.Data;
            }
        }

    看到这里 可以发现 多少有些相似。

  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/moguwang/p/5254206.html
Copyright © 2011-2022 走看看