• 数据结构03-顺序栈(用C++、C#、lua实现)






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

    1、C#实现

    栈接口
    IStack.cs

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

    顺序栈
    SeqStack.cs

    class SeqStack<T> : IStack<T>
        {
            private T[] mData;
            /// <summary>
            /// 指向栈顶的索引下标
            /// </summary>
            private int mTop;
            /// <summary>
            /// 栈最大容量
            /// </summary>
            private int mMaxSize;
    
    
            public SeqStack(int length)
            {
                mData = new T[length];
                mTop = -1;
                mMaxSize = length;
            }
            //默认栈容量为10
            public SeqStack() : this(10)
            {
            }
    
            public void Push(T item)
            {
                if (mMaxSize == GetLength())
                {
                    Console.WriteLine("栈中元素已满,无法入栈。");
                    return;
                }
                mTop++;
                mData[mTop] = item;
            }
    
            public T Pop()
            {
                if (mTop == -1)
                {
                    Console.WriteLine("栈中无元素,无法出栈。");
                    return default(T);
                }
                mTop--;
                return mData[mTop+1];
            }
    
            public void Clear()
            {
                mTop = -1;
            }
    
            public int GetLength()
            {
                return mTop + 1;
            }
    
            public bool IsEmpty()
            {
                return mTop == -1;
            }
    
            public T Peek()
            {
                return mData[mTop];
            }
    
            public void ShowAllElem()
            {
                for (int i = 0; i <= mTop; i++)
                {
                    Console.WriteLine(mData[i]);
                }
            }
        }
    

    Program.cs

        class Program
        {
            static void Main(string[] args)
            {
                IStack<string> strStack = new SeqStack<string>(4);
    
                strStack.Push("111");
                strStack.Push("222");
                strStack.Push("333");
                strStack.Push("444");
    
                strStack.Clear();
                strStack.Push("111");
                strStack.Push("222");
                strStack.Push("333");
                strStack.Push("444");
    
                //Console.WriteLine(strStack.IsEmpty());
                //Console.WriteLine(strStack.GetLength());
                //Console.WriteLine(strStack.Pop());
                //Console.WriteLine(strStack.Peek());
                strStack.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;
    };
    
    

    顺序栈
    SeqStack.cpp

    #include <iostream>
    #include "IStack.cpp"
    
    using namespace std;
    typedef int ElemType;
    
    typedef struct{
        ///栈顶指针(指向最上面元素的上一个)、栈底指针(指向最下面的元素)、最大容量
        ElemType* top;
        ElemType* base;
        int maxSize;
    }MyStack;
    
    class SeqStack : public IStack
    {
    private :
        MyStack mStack;
    
    public :
        ///默认栈容量设置为10
        SeqStack();
        SeqStack(int stackSize);
    
        ~SeqStack();
    
        int GetLength();
    
        bool IsEmpty();
    
        void Clear();
    
        void Push(ElemType item);
    
        ElemType Pop();
    
        ElemType Peek();
    
        void ShowAllElem();
    };
    
    SeqStack::SeqStack()
    {
        mStack.base = new ElemType[10];
        if(mStack.base==NULL){
            cout<<"分配空间失败!"<<endl;
            return;
        }
        mStack.top = mStack.base;
        mStack.maxSize = 10;
    }
    
    SeqStack::SeqStack(int stackSize)
    {
        mStack.base = new ElemType[stackSize];
        if(mStack.base==NULL){
            cout<<"分配空间失败!"<<endl;
            return;
        }
        mStack.top = mStack.base;
        mStack.maxSize = stackSize;
    }
    
    SeqStack::~SeqStack()
    {
        delete []mStack.base;
        mStack.base = NULL;
        mStack.top = NULL;
    }
    
    int SeqStack::GetLength()
    {
        return mStack.top - mStack.base;
    }
    
    bool SeqStack::IsEmpty()
    {
        return mStack.top == mStack.base;
    }
    
    void SeqStack::Clear()
    {
        mStack.top = mStack.base;
    }
    
    void SeqStack::Push(ElemType item)
    {
        if(GetLength() == mStack.maxSize){
            cout<<"入栈失败,空间已满。"<<endl;
            return;
        }
        *mStack.top = item;
        mStack.top++;
    }
    
    ElemType SeqStack::Pop()
    {
        if(mStack.top == mStack.base){
            cout<<"出栈失败,空间中无元素。"<<endl;
            return 0;
        }
    
        mStack.top--;
        return *mStack.top;
    }
    
    ElemType SeqStack::Peek()
    {
        if(mStack.top == mStack.base){
            cout<<"空间中无元素。"<<endl;
            return 0;
        }
        return *(mStack.top-1);
    }
    
    void SeqStack::ShowAllElem()
    {
        ElemType* temp = mStack.base;
        while(temp!=mStack.top){
            cout<<*temp<<endl;
            temp++;
        }
    }
    
    

    main.cpp

    #include <iostream>
    #include "SeqStack.cpp"
    
    using namespace std;
    
    int main()
    {
        SeqStack myStack(10);
    
        myStack.Push(111);
        myStack.Push(222);
        myStack.Push(333);
        myStack.Push(444);
    
        myStack.Clear();
        myStack.Push(111);
        myStack.Push(222);
        myStack.Push(333);
        myStack.Push(444);
    
        //cout<<myStack.GetLength()<<endl;
        //cout<<myStack.IsEmpty()<<endl;
        //cout<<myStack.Pop()<<endl;
        //cout<<myStack.Peek()<<endl;
    
        myStack.ShowAllElem();
    
        return 0;
    }
    
    

    3、lua实现

    --顺序栈和栈顶指针
    seqStack = {}
    top = 0
    
    --初始化
    function seqStack:Init()
    
    end
    
    --销毁
    function seqStack:Destory()
    	self = nil
    	top = nil
    end
    
    --清空
    function seqStack:Clear()
    	top = 0
    end
    
    --是否为空
    function seqStack:IsEmpty()
    	return top==0
    end
    
    --长度
    function seqStack:GetLength()
    	return top
    end
    
    --入栈
    function seqStack:Push(value)
    	top = top + 1
    	self[top] = value
    end
    
    --出栈
    function seqStack:Pop()
    	if(self:IsEmpty()) then
    		print("出栈失败,空间中无元素。");
    	else
    		top = top - 1
    		return self[top+1]
    	end
    end
    
    --获取栈顶元素
    function seqStack:Peek()
    	if(self:IsEmpty()) then
    		print("空间中无元素。");
    	else
    		return self[top]
    	end
    end
    
    --显示所有元素
    function seqStack:ShowAllElem()
    	for i=1,top,1 do
    		print(self[i])
    	end
    end
    
    
    --主运行函数
    function main()
    	seqStack:Init()
    	seqStack:Push(111)
    	seqStack:Push(222)
    	seqStack:Push(333)
    	seqStack:Push(444)
    
    	seqStack:Clear();
        seqStack:Push(111);
        seqStack:Push(222);
        seqStack:Push(333);
        seqStack:Push(444);
    
        --print(seqStack:GetLength())
        --print(seqStack:IsEmpty())
        --print(seqStack:Pop())
        --print(seqStack:Peek())
    
    	seqStack:ShowAllElem()
    end
    
    main()
    
    
  • 相关阅读:
    回溯-uva129
    【linux】【安全】服务器安全建议
    【linux】 服务器文件说明
    【linux】程序端口启动权限
    【android】安卓开发apk列表
    【网络基础】【TCP/IP】私有IP地址段
    【网络基础】【TCP/IP】IP的分级
    代数数论初步(全书)
    李代数笔记
    自由群,外代数和泛包络代数
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11792930.html
Copyright © 2020-2023  润新知