• 数据结构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中的冒号: 问题

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

  • 相关阅读:
    SVN访问配置及常用操作
    SVN配置
    在Eclipse中创建maven项目
    Maven的基础之环境配置
    线程池理解
    JVM之类的生命周期
    JAVA代码编程规范
    Jquery实现div局部页面刷新中js渲染失效问题解决
    觅踪17
    第十四周进度
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11799681.html
Copyright © 2020-2023  润新知