大师兄的数据结构学习笔记(二):堆栈

大师兄的数据结构学习笔记(一):线性结构
大师兄的数据结构学习笔记(三):队列

一、什么是堆栈(Stack)

  • 堆栈是具有一定操作约束的线性表。
  • 只在一端(栈顶, Top)做插入(入栈、PUSH)、删除(出栈、POP)。
  • 后入先出:Last In First OUT (LIFO)。


二、堆栈的抽象数据类型描述

  • 数据对象集: 一个有0个或多个元素的有穷线性表。
  • 操作集: 长度为MaxSize的堆栈,堆栈元素
操作 含义
Stack CreateStack(int MaxSize) 生成长度为MaxSize的空堆栈
int IsFull(Stack S,int MaxSIze) 判断堆栈S是否已满
void Push(Stack S,ElementType item) 将元素item压入堆栈
int IsEmpty(Stack S) 判断堆栈S是否为空
ElementType Pop(Stack S) 删除并返回栈顶元素

三、栈的顺序存储实现

  • 顺序栈通常由一个一维数组和一个记录栈顶元素位置的变量组成。


#ifndef SEQSTACK_H
#define SEQSTACK_H
typedef int DataType;

const int  MaxSize = 100;

class SeqStack
{
public: 
    SeqStack() { top = -1; };       //生成长度为MaxSize的空堆栈
    int IsFull();                   //判断堆栈S是否已满
    void Push(DataType item);       //将元素item压入堆栈
    int IsEmpty();                  //判断堆栈S是否为空
    DataType Pop();                 //删除并返回栈顶元素
private:
    DataType data[MaxSize];         //定义数组
    int top;                        //定义栈顶
};

#endif
#include 
#include "stack.h"

using namespace std;

void SeqStack::Push(DataType item)
{
    //将元素item压入堆栈
    if (top == MaxSize - 1) {
        printf("Stack is full!");
        return;
    }
    else {
        data[++top] = item;
        return;
    }
}

DataType SeqStack::Pop()
{
    //删除并返回栈顶元素
    if (top == -1){
        printf("Stack is empty");
        return 0;
    }
    else {
        return top--;
    }
};

int SeqStack::IsFull()
{
    //判断堆栈S是否已满
    return (top == MaxSize-1);
}

int SeqStack::IsEmpty()
{
    //判断堆栈S是否为空
    return top == -1;
}

四、堆栈的链式存储实现

  • 使用一个单链表实现。
  • 插入和删除在栈顶进行。


#ifndef SEQSTACK_H
#define SEQSTACK_H
typedef int DataType;

typedef struct Node
{
    // 定义数据结构
    DataType data;
    Node* next;
};

class SeqStack
{
public:
    SeqStack() { top->next = nullptr; };                  //构造函数
    void Push(DataType item);       //将元素item压入堆栈
    int IsEmpty();                  //判断堆栈S是否为空
    DataType Pop();                 //删除并返回栈顶元素
private:
    Node* top = new Node;
};

#endif
#include 
#include "stack.h"

using namespace std;

int SeqStack::IsEmpty()
{
    //判断堆栈S是否为空
    return top->next == nullptr;
}

void SeqStack::Push(DataType item)
{
    //将元素item压入堆栈
    Node* p=new Node;
    p->data=item;
    p->next = top->next;
    top->next = p;
}

DataType SeqStack::Pop()
{
    //删除并返回栈顶元素
    Node* new_top;
    DataType x;
    
    if (IsEmpty()) {
        printf("Stack is empty");
        return 0;
    }
    else {
        new_top = top->next;
        x = new_top->data;
        top->next = new_top->next;
        delete new_top;
        return(x);
    }
};

本文作者:大师兄(superkmi)

你可能感兴趣的:(大师兄的数据结构学习笔记(二):堆栈)