C++实现链式栈和线性栈

本文介绍了栈的概念及其后进先出特性,并详细讲解了C++中线性栈和链式栈的实现,包括进栈、出栈、取栈顶元素等操作。线性栈通过数组实现,需要考虑增加空间大小,而链式栈利用单链表,空间利用率更高。文章还提供了源码链接供读者参考。
摘要由CSDN通过智能技术生成

🍈前言

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

   栈的基本特点为: 后进先出(LIFO-last in first out):最后插入的元素最先出来。就像生活中我们取放盘子,当一摞盘子在桌子上时候,我们总是会取最上边的盘子,同时,我们在放盘子时,也会放在最上面。同样这种机制也在我们浏览网页时也有出现,在我们浏览网页时,左上角的转到上一页就是这种,最近浏览的网站在最上层,当返回时,先取到最上层的地址,这样即实现了逐层后退。

栈

   进栈(push):线性栈中,进栈数据存储在last+1(last为未进栈时栈顶元素的下标)的位置;链式表中,待进栈节点指向head的后继节点,head指向待进栈节点。

   出栈(pop):线性表中,栈顶的下标-1;链式栈中,head指向它后继节点的后继节点(head->next = head->next->next)。

   取栈顶(top):线性表中,返回下标为last-1的一个数据;链式表中,返回 head 的后继节点的数据。

🥝栈的操作接口

操作接口 功能
void push(T p) 将元素p插入到栈顶(进栈)
void pop() 删除栈顶对象
bool top(T &p) 成功得到栈顶元素返回true,并得到栈顶数据p
bool isEmpty() 判断栈是否为空
int size() 得到栈的大小

🍇线性栈

使用线性结构数组来实现栈的操作。

🍍线性栈的定义

template<class T>
class SeqStack {
   
public:
    T *data;
    int maxSize{
   };       //能存储的最大数据量
    int last{
   };          //当前存储的元素个数(并非元素下标)
public:
    SeqStack();                              //构造函数
    SeqStack(SeqStack<T> &list);             //拷贝构造函数
    ~SeqStack();                             //析构函数
    void reSize();                           //增加空间大小
    void push(T p);                          //进栈
    void pop();                              //出栈
    bool top(T &p);                          //取栈顶
    bool isEmpty();                          //判断栈是否为空
    int size();                              //返回栈的大小
    void print();                            //打印顺序栈
    void clear();                            //清空顺序栈
    void delete_link();                      //摧毁顺序栈
};

🍋基本函数

//构造函数
template<class T>
SeqStack<T>::SeqStack() {
   
    maxSize = 50;       //初始最大存储量为50
    last = 0;
    data = new T[maxSize];   //给数组分配空间

    if (data == NULL)           //动态分配失败
    {
   
        cerr << "存储分配错误!" << endl;
        exit(1);
    }
}

//拷贝构造函数
template<class T>
SeqStack<T>::SeqStack(SeqStack<T> &list) {
   
    maxSize = list.maxSize;
    last = list
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值