数据结构-栈与队列--栈

概念

  • 栈是一个==有序表==,它的插入操作(入栈)和删除操作(出栈)都只能在列表的==一个端点==(栈顶)进行。
    栈示意图

系统栈*

  • 用来处理程序运行时的函数调用;
    • 当一个函数被调用时,程序会生成一个被称为==活动记录==或==栈框架==的结构,并把这个程序放在系统的栈顶,当函数中调用其他函数时运行过程如下图:
      运行过程

定义ADT

  • 定义比较简单,代码如下:
template<class T>
class Stack
{
public:
    //创建空栈的容量
    Stack(int stackCapacity = 10);
    
    //检测栈是否为空
    bool isEmpty()const;

    //返回最上面的元素
    T& Top()const;

    //增加栈的容量
    void ChangeCapacitySize(int size);

    //添加元素
    void Push(const T& item);

    //删除最上面的元素
    void Pop();

private:
    //存储数组
    T* stack;
    //顶部指针
    int top;
    //栈容量
    int capactity;
};

容量拓展

  • 我们应该注意在添加时栈容量是否足够,在容量不够时,增加栈容量,添加容量函数如下:
template<class T>
void Stack<T>::ChangeCapacitySize(int size)
{
    if (size <= capactity)throw"只能增加容量!";
    T* temp = new T[size];
    if (capactity > 0)
    {
        copy(stack, stack + capactity, temp);
        delete[]stack;
    }
    stack = temp;
    capactity = size;
}

添加元素

  • 这样我们就可以放心的添加元素了,代码如下:
template<class T>
void Stack<T>::Push(const T& item)
{
    if (top == capactity - 1)
    {
        ChangeCapacitySize(capactity + 1);
    }
    stack[++top] = item;
}

删除元素

  • 因为元素类型为class类,所以我们删除某个元素我们可以直接调用T的析构函数
    T::~T()//析构函数
    代码如下:
template<class T>
void Stack<T>::Pop()
{
    if (isEmpy())throw"栈为空,不可删除!";
    stack[top--].~T();
}

代码总览

#include<iostream>
using namespace std;

template<class T>
class Stack
{
public:
    //创建空栈的容量
    Stack(int stackCapacity = 10);
    
    //检测栈是否为空
    bool isEmpty()const;

    //返回最上面的元素
    T& Top()const;

    //增加栈的容量
    void ChangeCapacitySize(int size);

    //添加元素
    void Push(const T& item);

    //删除最上面的元素
    void Pop();

private:
    //存储数组
    T* stack;
    //顶部指针
    int top;
    //栈容量
    int capactity;
};

template<class T>
Stack<T>::Stack(int stackCapacity)
{
    if (stackCapacity < 1)throw"定义容量必须大于1!";
    capactity = stackCapacity;
    stack = new T[capactity];
    top = -1;
}

template<class T>
bool Stack<T>::isEmpty() const
{
    return top==-1;
}

template<class T>
T& Stack<T>::Top() const
{
    if (top == -1)throw"栈为空!";
    return stack[top];
}

template<class T>
void Stack<T>::ChangeCapacitySize(int size)
{
    if (size <= capactity)throw"只能增加容量!";
    T* temp = new T[size];
    if (capactity > 0)
    {
        copy(stack, stack + capactity, temp);
        delete[]stack;
    }
    stack = temp;
    capactity = size;
}

template<class T>
void Stack<T>::Push(const T& item)
{
    if (top == capactity - 1)
    {
        ChangeCapacitySize(capactity + 1);
    }
    stack[++top] = item;
}

template<class T>
void Stack<T>::Pop()
{
    if (isEmpy())throw"栈为空,不可删除!";
    stack[top--].~T();
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容