zoukankan      html  css  js  c++  java
  • 数据结构04-链栈(用C++、C#、lua实现)





    本文为数据结构-链栈的代码实现。
    作者水平比较差,有错误的地方请见谅。

    1、C#实现

    栈接口
    IStack.cs

    	/// <summary>
        /// 栈接口
        /// </summary>
        public interface IStack<T>
        {
            int GetLength(); //求栈的长度
            bool IsEmpty(); //判断栈是否为空
            void Clear(); //清空
            void Push(T data); //入栈
            T Pop(); //出栈
            T Peek(); //取栈顶元素
            void ShowAllElem(); //显示栈中所有元素
        }
    

    链栈
    LinkStack.cs

    	class LinkStack<T> : IStack<T>
        {
            //链栈不需要附加一个头结点
            /// <summary>
            /// 栈顶元素
            /// </summary>
            private StackNode<T> mTopNode;
            /// <summary>
            /// 栈元素个数
            /// </summary>
            private int mCount;
    
            public LinkStack()
            {
                mTopNode = null;
                mCount = 0;
            }
    
            public bool IsEmpty()
            {
                return GetLength() == 0;
            }
    
            public int GetLength()
            {
                return mCount;
            }
    
            public void Push(T data)
            {
                StackNode<T> newNode = new StackNode<T>(data);
                //栈中无元素
                if (GetLength() == 0)
                {
                    mTopNode = newNode;
                }
                else
                {
                    newNode.Next = mTopNode;
                    mTopNode = newNode;
                }
                mCount++;
            }
    
            public T Pop()
            {
                //栈中无元素
                if (GetLength() == 0)
                {
                    Console.WriteLine("栈中无元素,无法出栈。");
                    return default(T);
                }
                else
                {
                    T data = mTopNode.Data;
                    mTopNode = mTopNode.Next;
                    mCount--;
                    return data;
                }
            }
    
            public T Peek()
            {
                //栈中无元素
                if (GetLength() == 0)
                {
                    Console.WriteLine("栈中无元素,无法获取栈顶元素。");
                    return default(T);
                }
                else
                {
                    return mTopNode.Data;
                }
            }
    
            public void Clear()
            {
                mTopNode = null;
                mCount = 0;
            }
    
            public void ShowAllElem()
            {
                StackNode<T> temp = mTopNode;
                while (temp != null)
                {
                    Console.WriteLine(temp.Data);
                    temp = temp.Next;
                }
            }
        }
    

    Program.cs

    	class Program
        {
            static void Main(string[] args)
            {
                IStack<string> linkStack = new LinkStack<string>();
    
    			//测试
                linkStack.Push("111");
                linkStack.Push("222");
                linkStack.Push("333");
                linkStack.Push("444");
    
                linkStack.Clear();
                linkStack.Push("111");
                linkStack.Push("222");
                linkStack.Push("333");
                linkStack.Push("444");
    
    
                //Console.WriteLine(linkStack.IsEmpty());
                //Console.WriteLine(linkStack.GetLength());
                //linkStack.Pop();
                //Console.WriteLine(linkStack.Peek());
                linkStack.ShowAllElem();
    
                Console.ReadKey();
            }
        }
    

    2、C++实现

    栈接口
    IStack.cpp

    #include <iostream>
    using namespace std;
    
    typedef int ElemType;
    
    class IStack
    {
    public :
        ///求栈的长度
        virtual int GetLength() = 0;
    
        ///判断栈是否为空
        virtual bool IsEmpty() = 0;
    
        ///清空操作
        virtual void Clear() = 0;
    
        ///入栈操作
        virtual void Push(ElemType item) = 0;
    
        ///出栈操作
        virtual ElemType Pop() = 0;
    
        ///取栈顶元素
        virtual ElemType Peek() = 0;
    
        ///显示所有元素
        virtual void ShowAllElem() = 0;
    };
    
    

    链栈
    LinkStack.cpp

    #include <iostream>
    #include "IStack.cpp"
    
    using namespace std;
    typedef int ElemType;
    
    typedef struct SNode{
        ElemType data;
        SNode* next;
    }SNode,*StackNode;
    
    class LinkStack : public IStack
    {
    private :
        StackNode topNode;
    
    public :
        LinkStack();
    
        ~LinkStack();
    
        int GetLength();
    
        bool IsEmpty();
    
        void Clear();
    
        void Push(ElemType item);
    
        ElemType Pop();
    
        ElemType Peek();
    
        void ShowAllElem();
    };
    
    
    LinkStack::LinkStack()
    {
        topNode = NULL;
    }
    
    LinkStack::~LinkStack()
    {
        //释放所有结点指向的空间
        while(topNode != NULL){
            StackNode temp = topNode;
            topNode = topNode->next;
            delete temp;
        }
    }
    
    int LinkStack::GetLength()
    {
        StackNode temp = topNode;
        int length = 0;
        while(temp != NULL){
            length++;
            temp = temp->next;
        }
        return length;
    }
    
    bool LinkStack::IsEmpty()
    {
        return GetLength() == 0;
    }
    
    
    void LinkStack::Push(ElemType item)
    {
        StackNode newNode = new SNode();
        if(newNode == NULL){
            cout<<"分配失败
    ";
            return ;
        }
        newNode->data = item;
        newNode->next = topNode;
        topNode = newNode;
    }
    
    ElemType LinkStack::Pop()
    {
        //栈中无元素
        if (GetLength() == 0)
        {
            cout<<"栈中无元素,无法出栈。";
            return 0;
        }
    
        ElemType data = topNode->data;
        StackNode temp = topNode;
        topNode = topNode->next;
        delete temp;
    
        return data;
    }
    
    ElemType LinkStack::Peek()
    {
        //栈中无元素
        if (GetLength() == 0)
        {
            cout<<"栈中无元素,无法获取栈顶元素。";
            return 0;
        }
    
        return topNode->data;
    }
    
    void LinkStack::Clear()
    {
        while(topNode != NULL){
            StackNode temp = topNode;
            topNode = topNode->next;
            delete temp;
        }
        topNode = NULL;
    }
    
    void LinkStack::ShowAllElem()
    {
        StackNode temp = topNode;
        while(topNode != NULL){
            cout<<topNode->data<<endl;
            topNode = topNode->next;
        }
    }
    
    

    main.cpp

    #include <iostream>
    #include "LinkStack.cpp"
    
    using namespace std;
    
    int main()
    {
        ///链栈
        LinkStack linkStack;
    
    	//测试
        linkStack.Push(111);
        linkStack.Push(222);
        linkStack.Push(333);
        linkStack.Push(444);
    
        linkStack.Clear();
        linkStack.Push(111);
        linkStack.Push(222);
        linkStack.Push(333);
        linkStack.Push(444);
    
    
        //cout<<linkStack.GetLength()<<endl;
        //cout<<linkStack.IsEmpty()<<endl;
        //cout<<linkStack.Peek()<<endl;
        //cout<<linkStack.Peek()<<endl;
    
        linkStack.ShowAllElem();
    
    
        return 0;
    }
    
    

    3、lua实现

    --链栈栈顶结点
    topNode = {}
    count = 0
    
    
    --初始化
    function Init()
    	count = 0
    end
    
    --销毁
    function Destory()
    	topNode = nil
    	count = nil
    end
    
    --清空
    function Clear()
    	count = 0
    end
    
    --是否为空
    function IsEmpty()
    	return count == 0
    end
    
    --长度
    function GetLength()
    	return count
    end
    
    --入栈
    function Push(value)
    	local node = {}
    	node.data = value
    	if(GetLength() == 0) then
    		node.next = nil
    		topNode = node
    	else
    		node.next = topNode
    		topNode = node
    	end
    
    	count = count + 1
    end
    
    --出栈
    function Pop()
    	local data = topNode.data
    	topNode = topNode.next
    
    	return data
    end
    
    --获取栈顶元素
    function Peek()
    	return topNode.data
    end
    
    --显示所有元素
    function ShowAllElem()
    	local temp = topNode
    	while(temp ~= nil) do
    		print(temp.data)
    		temp = temp.next
    	end
    end
    
    --主运行函数
    function main()
    	Init()
    	Push(111)
    	Push(222)
    	Push(333)
    	Push(444)
    
    	Clear()
    	Push(111)
    	Push(222)
    	Push(333)
    	Push(444)
    
    	print(Pop())
    	print(Peek())
    	print(IsEmpty())
    	print(GetLength())
    
    	ShowAllElem()
    
    end
    
    main()
    

    4、新知识和疑问

    4.1 C++中的delete和NULL

    delete是把对象new后,系统分配给其的空间给释放掉。释放了之后,这个内存空间就可以被其他对象申请。
    但是此对象的值本身是不变的,只是回收了指向的空间。

    NULL则是把指针置为空指针,其不再指向任何实际的对象或者函数。
    此时其就是一个值为0的常量。

    测试

    #include <iostream>
    using namespace std;
    
    class classA
    {
    };
    
    int main()
    {
        classA* test = new classA();
        cout<<test<<endl;
    	//输出test指向的地址
    
        delete test;
        cout<<test<<endl;
    	//输出test指向的地址
    
        test = NULL;
        cout<<test<<endl;
    	//输出0
    
        return 0;
    }
    

    4.2 lua中的冒号: 问题

    因为我们定义的头结点是每当入栈一个元素时,都会改变指向的。
    那么定义函数的时候再使用冒号:加函数名的形式,会报错。
    所以把方式改为了直接调用函数形式。

  • 相关阅读:
    B.Icebound and Sequence
    Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS
    Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
    Educational Codeforces Round 65 (Rated for Div. 2) B. Lost Numbers
    Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number
    Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
    Codeforces Round #561 (Div. 2) B. All the Vowels Please
    Codeforces Round #561 (Div. 2) A. Silent Classroom
    HDU-2119-Matrix(最大匹配)
    读书的感想!
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11799681.html
Copyright © 2011-2022 走看看