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);
}

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

目录
相关文章
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
1193 77
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
605 7
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
604 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
395 9
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
571 7
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
737 5
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
564 5
|
算法 C++
单调栈(C/C++)
单调栈(C/C++)
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
程序员 编译器 C++
C++内存分区模型(代码区、全局区、栈区、堆区)
C++内存分区模型(代码区、全局区、栈区、堆区)
260 0