来源:互联网 发布:二维条码扫描软件 编辑:程序博客网 时间:2024/06/05 00:13

栈(stack)(数据结构中的栈)是一种动态集合,且在其上进行delete操作所移除的元素
是预先设定的。被删除的元素是最近插入的元素:栈实现的是一种后进先出的策略。
栈分为顺序栈和链栈,下面就两种栈分别用c++实现其基本功能。
一、顺序栈:(c++实现)

    1.
#include <iostream> using namespace std;//顺序栈; template <typename T> class stack{ public:    //构造函数;    stack()    {    m_iTop = -1;    memset(m_Array, 0, sizeof(m_Array));    }//析构函数;    ~stack()  {}private:    //栈的容量;    enum {m_iCapacity = 10};    //指向栈顶的索引;    int         m_iTop;    //存储数据的数组;    T           m_Array[m_iCapacity]; public:    //判断栈空;    bool isEmpty()    {   f (m_iTop == -1)    {       return true;    }   return false;  }    //判断栈满;    bool isFull()    {  if (m_iTop == m_iCapacity - 1)  {    return true;  }  return false;    }    //入栈;    void push_back(T _element)    {           if (isFull())           {               cout<<"stack is full!"<<endl;               return;           }           m_iTop++;           m_Array[m_iTop] = _element;    }    //出栈;    void pop_back()    {           if (isEmpty())           {               cout<<"stack is empty!"<<endl;               return;           }           m_Array[m_iTop] = NULL;           m_iTop--;}    //清空栈;  void clear()    {           memset(m_Array, 0, sizeof(m_Array));           m_iTop = -1;    }    //获得栈中元素数目;    int size()  {           return (m_iTop+1);   }    //获得栈顶元素;    int getPopElement()    {           if (isEmpty())           {               cout<<"stack is empty!"<<endl;               return NULL;           }           return m_Array[m_iTop];    }};
//测试代码;stack<int> _stack;if (_stack.isEmpty()){    cout<<"_stack is empty"<<endl;}cout<<" "<<_stack.getPopElement()<<endl;for (int j = 0; j<15; j++){    _stack.push_back(j);}cout<<" "<<_stack.getPopElement()<<endl;cout<<"_stack size : "<<_stack.size()<<endl;_stack.pop_back();cout<<"_stack size : "<<_stack.size()<<endl;for (int j = 0; j<16; j++){    _stack.pop_back();}cout<<"_stack size : "<<_stack.size()<<endl;

二、链栈:(c++实现)

#include <iostream>using namespace std;//链栈;template <typename T>class ListStack {private:    struct Node    {        T       data    ;           // 数据;        Node*   pNext   ;           //下一个节点的指针;    };    Node*           m_pHead;        //头节点;    int             m_iCount;       //节点数目;public:    //构造函数;    ListStack()    {        m_iCount = 0;        m_pHead = nullptr;    }    //析构函数;    ~ListStack()    {    }public:    //判断空栈;    bool isEmpty()    {        if (m_pHead == nullptr)        {            return true;        }        return false;    }    //向栈顶添加元素;    bool push_back(T _element)    {        Node* pTemp = new Node();        if (!pTemp)        {            return false;        }        pTemp->data = _element;        pTemp->pNext = m_pHead;        m_pHead = pTemp;        m_iCount++;        return true;    }    //删除栈顶元素;    void pop_back()    {        if (!m_pHead)        {            return;        }        Node* pTemp = m_pHead;        m_pHead = m_pHead->pNext;        delete  pTemp;        pTemp = nullptr;        --m_iCount;    }    //获得栈中元素数量;    const int& size()    {        return m_iCount;    }    //清空栈;    void clear()    {        Node* pTemp = nullptr;        while (m_pHead)        {            pTemp = m_pHead;            m_pHead = m_pHead->pNext;            delete pTemp;            pTemp = nullptr;            --m_iCount;        }    }    //获得栈顶元素;    const T&  getHeadElement()    {        if (!m_pHead)        {            cout<<"stack is empty! get head element fail!"<<endl;            return NULL;        }        return m_pHead->data;    }};//测试链栈;ListStack<int> _stack;    cout<<"_stack size:: "<<_stack.size()<<endl;    _stack.pop_back();    _stack.push_back(1);    cout<<"_stack size : "<<_stack.size()<<"   "<<_stack.getHeadElement()<<endl;    for (int j = 0; j<100; j++)    {        _stack.push_back(j);    }    cout<<"_stack size::"<<_stack.size()<<endl;    int a[] = {1,3,24,58};    int b[] = {100,302,33};    ListStack<int*> _stack1;    cout<<"_stack1 size:: "<<_stack1.size()<<endl;    _stack1.push_back(a);    _stack1.push_back(b);    cout<<"_stack1 size: "<<_stack1.size()<<endl;    _stack1.pop_back();    cout<<"_stack1 size: "<<_stack1.size()<<endl;    const  int*  p = _stack1.getHeadElement();    for (int j = 0; j<4; j++)    {        cout<<" , "<<p[j]<<endl;    }    _stack1.pop_back();    cout<<"_stack1 size:: "<<_stack1.size()<<endl;    _stack1.push_back(a);    _stack1.push_back(b);    cout<<"_stack1 size:: "<<_stack1.size()<<endl;    _stack1.clear();    cout<<"_stack1 size:: "<<_stack1.size()<<endl;
0 0
原创粉丝点击