• 顺序栈的c语言实现和OOP实现


    C语言实现顺序栈和OOP实现顺序栈

    1,顺序栈

    (1)定义:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

    (2)栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

    (3)图解:栈的模型

    2,C语言实现顺序栈

    #include<stdio.h>
    #include<assert.h>
    #define STACK_LEN 5
    typedef struct Sqstack
    {
    	int elem[STACK_LEN];
    	int top;//当前可存放数据的下标
    }Sqstack,*Pstack;
    void InitStack(Pstack ps)
    {
        assert(ps!=NULL);
        ps->top=0;
    }
    bool Push(Pstack ps,int val)//压栈
    {
        assert(ps!=NULL);
        if(Isfull(ps))
        {
            return false;
        }
        ps->elem[ps->top++]=val;
        return true;
    }
    bool Pop(Pstack ps,int *rtv)//删除、出栈
    {
        assert(ps!=NULL);
        if(IsEmpty(ps))
        {
             return false;       
        }
        if(rtv!=NULL)
        {
            ps->top--;
            *rtv=ps->elem[ps->top];
        }
    }
    bool GetTop(Pstack ps,int *rtv)//得到栈顶元素, 但是不删除
    {
        assert(ps!=NULL);
        if(IsEmpty(ps))
        {
            return false;
        }
        if(rtv!=NULL)
        {
            *rtv=ps->elem[ps->top-1];
        }
    }
    bool IsEmpty(Pstack ps)//判空
    {
        assert(ps!=NULL);
        return ps->top==0;
    }
    bool Isfull(Pstack ps)//判满
    {
        assert(ps!=NULL);
        return ps->top==STACK_LEN;
    }
    void Clear(Pstack ps)//top 指针的操作
    {
        ps->top=0;
    }
    void Destroy(Pstack ps);//这里没有动态内存分配
    {
        Clear(ps);
    }
    void Show(Pstack ps)
    {
        for(int i=0;i<ps->top;i++)
        {
            printf("%d ",ps->elem[i]);
        }
        printf("
    ");
    }
    

    3,用OOP实现一个顺序栈

    #include<iostream>
    using namespace std;
    
    class CStack
    {
     public:
        CStack()        //默认构造函数
        {
            mtop=0;
            msize=10;
            mStack=new int[msize];
        }
        /*CStack(int size=10)   //带参数的构造函数
        {
            mtop=0;
            msize=size;
            mStack=new int[msize];
        }*/
        
        ~CStack()                        //析构
        {
            delete[]mStack;
            mStack=NULL;
        }
        
         void push(int val)                 //入栈
         {
             if(full())
             {
                 resize();
             }
             mStack[mtop++]=val;
         }
        
        void pop()                     //出栈
        {
            if(empty())
            {
                return ;
            }
            mtop--;
        }
        
        int top()                      //获取栈顶元素
        { 
           return mStack[mtop-1]; 
        }
        
        bool full()              //判满
        {
            return mtop==msize;
        }
        bool empty()              //判空
        {
            return mtop==0;
        }
      private:
        int*mStack;
        int mtop;
        int msize;
        void resize()                //二倍扩容
        {
            int *mtmp=new int[msize*2];
            for(int i=0;i<msize;i++)
            {
                mtemp[i]=mStack[i];
            }
            delete[]mStack;
            mStack=mtmp;
            msize*=2;
        }
    };
    
  • 相关阅读:
    eclipse设置字体大小
    如何利用服务器下发的Cookie实现基于此Cookie的会话保持
    Docker学习笔记_安装和使用Python
    Docker学习笔记_安装和使用mysql
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json: dial unix /var/run/docker.sock: conne
    Ubuntu18.04创建新的系统用户
    Docker学习笔记_安装和使用nginx
    Docker安装和使用Tomcat
    虚拟机ubuntu18.04设置静态IP
    我学习参考的网址
  • 原文地址:https://www.cnblogs.com/earthmolin/p/9922107.html
Copyright © 2020-2023  润新知