【010】数据结构:受限线性表之栈的顺序存储——C++代码实现(使用模板类)

栈:

  • 是一种特殊的线性表(具有线性关系,即前驱和后继)

特性:

  • 先进后出
  • 限制了线性表插入和删除的位置,始终只在栈顶进行
  • 栈底是固定的,最先进栈的只能在栈底

操作:

  • 栈的插入操作:进栈(压栈)
  • 栈的删除操作:出栈(弹栈)
  • 销毁栈
  • 清空栈
  • 获取栈顶元素
  • 获取栈的大小

栈的顺序存储:

  • 栈的顺序存储简称顺序栈,它是运算受限的顺序表
  • 顺序栈的存储结构:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指向栈顶元素在顺序表中的位置

设计与实现:

  • 栈是一种特殊的线性表,所以栈的顺序存储可以通过顺序线性表(数组)来实现
  • 以数组右边为栈顶,数据的插入和删除不需要频繁移动元素

栈的顺序存储C++代码实现

SeqStack.hpp

注: 在使用模板类时,函数的声明和实现必须在同一个文件中,否则会报错

顺序栈的声明

#ifndef SEQSTACK_H
#define SEQSTACK_H

#include <iostream>

//数组模拟栈的顺序存储
const int MAX_SIZE = 1024;

template <typename T>
class SeqStack
{
private:
    T data[MAX_SIZE];
    int size;

public:
    SeqStack();
    ~SeqStack();

    //入栈
    void push(T date);
    //返回栈顶元素
    T top();
    //出栈
    void pop();
    //判断是否为空
    bool isEmpty();
    //返回栈中元素个数
    int getSize();
    //清空
    void clear();
};

#endif

顺序栈的定义(实现)

template <typename T>
SeqStack<T>::SeqStack()
{
    size = 0;
}

template <typename T>
SeqStack<T>::~SeqStack()
{
}

//入栈
template <typename T>
void SeqStack<T>::push(T date)
{
    if (size == MAX_SIZE)
    {
        std::cerr << "ERRER: The stack is full!" << std::endl;
        return;
    }
    data[size] = date;
    size++;
}

//返回栈顶元素
template <typename T>
T SeqStack<T>::top()
{
    if (size == 0)
        exit(EXIT_FAILURE);
    return data[size - 1];
}

//出栈
template <typename T>
void SeqStack<T>::pop()
{
    if (size == 0)
    {
        std::cerr << "ERROR: The stack is empty!" << std::endl;
        return;
    }
    size--;
}

//判断是否为空
template <typename T>
bool SeqStack<T>::isEmpty()
{
    if (size == 0)
        return true;
    return false;
}

//返回栈中元素个数
template <typename T>
int SeqStack<T>::getSize()
{
    return size;
}

//清空
template <typename T>
void SeqStack<T>::clear()
{
    size = 0;
}
main.cpp(测试)
#include <iostream>
#include "SeqStack.hpp"

struct Person
{
    char name[64];
    int age;
};


int main()
{
    SeqStack<Person> stack;
    std::cout << stack.getSize() << std::endl;

    //创建数据
    Person p1 = {"aaa", 10};
    Person p2 = {"bbb", 23};
    Person p3 = {"ccc", 24};
    Person p4 = {"ddd", 45};
    Person p5 = {"eee", 54};

    //入栈
    stack.push(p1);
    stack.push(p2);
    stack.push(p3);
    stack.push(p4);
    stack.push(p5);

    //输出
    while (stack.getSize()>0)
    {
        Person p = stack.top();
        std::cout << p.name << ":" << p.age << std::endl;
        stack.pop();
    }
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值