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

  1. 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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值