C++实现线性表 - 04 栈

简介: 今天我们来学习一下栈结构,栈在C++的STL中同样可以直接调用,但是我们可以用C++自己实现栈的结构。
写在前面:
今天我们来学习一下栈结构,栈在C++的STL中同样可以直接调用,但是我们可以用C++自己实现栈的结构。

栈的定义

栈满足“先进后出”的原则,也就是说只能从尾部插入和删除,而栈的实现可以通过数组和链表两种方法实现,我们一般常用数组来进行模拟,下面的讲解都以数组的实现进行。
实现栈的结构需要存储数据的地方和一个指向栈顶的指针,而用数组实现的话指针一开始的位置就在下标 0 或 -1 ,我一般习惯初始化指针在下标为 -1 的位置。

struct Stack {
    int Sacklist[MAXVERTIES] = { 0 };    //初始化栈中元素
    int top = -1;    //初始化指针位置
};

0.jpg

栈的插入

当我们不断往这个栈中放入数据时,指针下标也会不断的增加。
1.jpg

2.jpg

void Push(Stack& S, int key) {
    if (S.top == MAXVERTIES) {
        cout << "栈已满!" << endl;
        return;
    }
    ++S.top;
    S.Sacklist[S.top] = key;
}

栈的删除

当你想要删除或取出栈中元素时,你只能从最顶端的元素开始取,这个过程中指针的下标又会减小。
3.jpg

但是这里需要注意的是,删除或取出数组中的元素并不会随之消失,只是指针在变动,下次插入数据时就会覆盖之前的内容。

//删除栈顶元素
void Pop(Stack& S) {
    if (S.top == -1) {
        cout << "栈为空!" << endl;
        return;
    }
    int temp = S.Sacklist[S.top];
    --S.top;
}

返回栈顶元素

//返回栈顶元素
int top(Stack& S) {
    return S.Sacklist[S.top];
}

查找栈中元素

//判断栈中的元素是否存在(存在则返回对应下标,不存在则返回0)
int find(Stack& S, int key) {
    if (S.top == -1) {
        cout << "栈为空!" << endl;
        return -1;
    }
    //定义一个临时指针指向栈顶
    for (int temp = S.top; temp != -1; --temp) {
        if (S.Sacklist[temp] == key)
            return temp;
    }
    cout << "查无此元素!" << endl;
    return 0;
}

删除指定元素

这个地方要注意的是,我们想要删除栈中任意一处元素时,需要先把删除元素上面的所有元素出栈,并将出栈元素用一个临时栈来储存,然后将该元素删除,再把刚刚出栈的元素入栈。
4.jpg

5.jpg

6.jpg

7.jpg

8.jpg

9.jpg

//删除指定元素
void delete_index(Stack& S, int key) {
    Stack temp;    //需要一个临时的栈去接收原始栈倒出来的元素
    int index = find(S, key);    //查找此元素
    if (index <= 0)
        return;
    while (S.top != index) {
        Push(temp, S.Sacklist[S.top]);
        Pop(S);
    }
    Pop(S);    //删除指定元素
    while (temp.top != -1) {
        S.Sacklist[++S.top] = temp.Sacklist[temp.top];    //将临时栈中的元素再倒回去
        --temp.top;
    }
}

遍历栈

//遍历整个栈
void show(Stack& S) {
    if (S.top == -1)
        cout << "栈为空!" << endl;
    int temp = S.top;    //定义一个临时指针
    while (temp != -1) {
        cout << S.Sacklist[temp] << " ";
        --temp;
    }
    cout << endl;
}

全部代码

#include <bits/stdc++.h>
using namespace std;
#define MAXVERTIES 20

//栈的结构体
struct Stack {
    int Sacklist[MAXVERTIES] = { 0 };    //初始化栈中元素
    int top = -1;    //初始化指针位置
};

//往栈中推入元素
void Push(Stack& S, int key) {
    if (S.top == MAXVERTIES) {
        cout << "栈已满!" << endl;
        return;
    }
    ++S.top;
    S.Sacklist[S.top] = key;
}

//删除栈顶元素
void Pop(Stack& S) {
    if (S.top == -1) {
        cout << "栈为空!" << endl;
        return;
    }
    int temp = S.Sacklist[S.top];
    --S.top;
}

//返回栈顶元素
int top(Stack& S) {
    return S.Sacklist[S.top];
}

//判断栈中的元素是否存在(存在则返回对应下标,不存在则返回0)
int find(Stack& S, int key) {
    if (S.top == -1) {
        cout << "栈为空!" << endl;
        return -1;
    }
    //定义一个临时指针指向栈顶
    for (int temp = S.top; temp != -1; --temp) {
        if (S.Sacklist[temp] == key)
            return temp;
    }
    cout << "查无此元素!" << endl;
    return 0;
}

//删除指定元素
void delete_index(Stack& S, int key) {
    Stack temp;    //需要一个临时的栈去接收原始栈倒出来的元素
    int index = find(S, key);    //查找此元素
    if (index <= 0)
        return;
    while (S.top != index) {
        Push(temp, S.Sacklist[S.top]);
        Pop(S);
    }
    Pop(S);    //删除指定元素
    while (temp.top != -1) {
        S.Sacklist[++S.top] = temp.Sacklist[temp.top];    //将临时栈中的元素再倒回去
        --temp.top;
    }
}

//遍历整个栈
void show(Stack& S) {
    if (S.top == -1)
        cout << "栈为空!" << endl;
    int temp = S.top;    //定义一个临时指针
    while (temp != -1) {
        cout << S.Sacklist[temp] << " ";
        --temp;
    }
    cout << endl;
}

int main() {
    Stack S;
    Push(S, 1);
    Push(S, 8);
    Push(S, 5);
    Push(S, 4);
    Push(S, 2);
    show(S);
    Pop(S);
    show(S);
    delete_index(S, 2);
    delete_index(S, 5);
    show(S);
}

如果大家有什么问题的话,欢迎在下方评论区进行讨论哦~

目录
相关文章
|
30天前
|
算法 C++
|
30天前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
6月前
|
存储 设计模式 C语言
C++中的栈和队列
C++中的栈和队列
44 0
|
5月前
|
存储 算法 程序员
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
54 4
|
5月前
|
程序员 编译器 C++
C++内存分区模型(代码区、全局区、栈区、堆区)
C++内存分区模型(代码区、全局区、栈区、堆区)
|
6月前
|
算法 C++
c++算法学习笔记 (15) 单调栈与单调队列
c++算法学习笔记 (15) 单调栈与单调队列
|
6月前
|
算法 C++
c++算法学习笔记 (14) 栈与队列
c++算法学习笔记 (14) 栈与队列
|
6月前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
60 0
|
6月前
|
存储 机器学习/深度学习 人工智能
c/c++线性表实现附源码(超详解)
c/c++线性表实现附源码(超详解)
67 0
|
6月前
|
设计模式 C语言 C++
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理