【C++复习】栈-上篇
Table of Contents

大家好,这里是不会写开场白的Yinph。

我们直接进入正题,开始进行C++的复习——栈:

一、什么是栈? Link to 一、什么是栈?

栈,又名堆栈(stack)。作为一种特殊的数据结构,它是一种只能在一端进行插入和删除操作的特殊线性表

想象一下,我们用一个大箱子来堆积物品,先堆进来的压在最底下,随后一件件物品往上堆。而取走时,也只能从最上面开始拿。栈也是如此,它就是一种类似箱子堆积物品的数据结构,先放最晚拿,后放最早拿

箱子(栈)的最上面我们称之为栈顶(top),允许插入(push)和删除(pop),删完了,也就是栈底就是栈顶的时候,就叫空栈。而最下面称之为栈底(Bottom),什么也不能干。

一个简单的口诀:“先进后出,后进先出。”

进栈与出栈

因为栈空间是有限的,如果栈已满,在进行入栈操作时,就会产生“上溢”。上溢将使程序无法继续运行,我们要想办法避免。而对于出栈操作中的“下溢”,程序中仅会给出一个标志信息,我们无需过度在意。

二、栈的常用操作 Link to 二、栈的常用操作

栈的常用操作有:入栈(push)、出栈(pop)、取栈顶元素(top)、判断栈是否为空(isEmpty)、清空栈(clear)获取栈内元素个数(size)。

(1)数组模拟栈 Link to (1)数组模拟栈

由于计算机中没有栈这种存储结构,我们可以用顺序存储结构——数组来模拟栈。具体如下:

首先,我们可以定义一个全局数组st,作为栈的存储结构,并将栈顶指针TOP初始化为0。接下来,我们可以定义一些函数,用于模拟栈的操作。

入栈:将元素压入栈顶,栈顶指针top加1,将元素存储在top指向的位置。

出栈:将栈顶元素弹出,栈顶指针top减1。

取栈顶元素:获取栈顶指针top指向的元素。

判断栈是否为空:判断栈顶指针top是否为-1。

清空栈:将栈顶指针top置为-1。

获取栈内元素个数:获取栈顶指针top的值。

接下来,我们用代码来解决一些问题:

我们可以尝试将整数1、2、3、4、5入栈,接着输出此时的栈顶,最后输出栈内所有的元素。

CPP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
using namespace std;

int st[n+1]; // n为元素个数,创建数组时长度比元素个数多1	
int TOP = 0; // 从数组下标为1的位置开始存放数据,栈空时,TOP=0

void push(int x)//入栈
{	
    TOP++;	
    st[TOP] = x;	
}
void pop( ) //出栈
{	
    TOP--;	
}
int top( ) // 获取栈顶元素	
{	
    return st[TOP];	
}
bool isempty( ) //判断栈是否为空	
{
    return TOP == 0;	
}
void clear( ) //清空
{
    TOP = 0;	
}
int size( ) // 获取栈内元素个数
{
    return TOP;	
}

int main()
{
    for (int i = 1; i <= 5; i++)
    {
      push(i); // 入栈
    }
    cout << "当前栈顶元素为:" << top() << endl;
    cout << "出栈顺序为:" << size() << endl;
    while (!isempty()) // 判断栈是否为空
    {
      cout << top() << " ";
      pop(); // 出栈
    }
    return 0;
}

(2)使用标准模板库(STL) Link to (2)使用标准模板库(STL)

标准模板库(STL),是一些常用数据结构(栈、队列等)和算法(sort、swap等)的模板的集合。有了STL,不必再写太多的标准数据结构和算法,并且性能也会更高。

除了用顺序存储结构——数组模拟栈之外,STL也提供了栈的模板类,可以直接使用,非常方便。

头文件:#include <stack>

定义:stack<数据类型> 栈名;

例如:stack<int> s;

栈(stack)常用函数:

push(x):将x入栈

pop():弹出栈顶元素

top():获得栈顶元素

empty():检测栈是否为空,返回true为空,false为非空。常与if语句连用,例如if (s.empty())

size():获取栈中元素个数(可理解为总长度)

以一张图即可理解:

栈的常用函数

同样的问题,我们用STL来解决一下:

CPP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stack> // 头文件
using namespace std;

int main()
{
    stack<int> s; // 定义一个栈
    for (int i = 1; i <= 5; i++)
    {
      s.push(i); // 入栈
    }
    cout << "栈顶元素为:" << s.top() << endl;
    cout << "栈内元素个数为:" << s.size() << endl;
    while (!s.empty()) // 判断栈是否为空
    {
      cout << s.top() << " "; // 输出栈顶元素
      s.pop(); // 出栈
    }
    return 0;
}

三、总结一下 Link to 三、总结一下

栈是一种先进后出的数据结构,它只能在一端进行插入和删除操作。在C++中,我们可以使用数组STL中的stack模板类来模拟栈的操作。栈的常用操作包括入栈、出栈、取栈顶元素、判断栈是否为空、清空栈和获取栈内元素个数。

希望这篇文章能帮助你们更好地理解栈,如果你有任何问题,欢迎在评论区留言。

OK,以上就是今天要讲的内容。大家喜欢就点个赞吧,我会尽快更新!ヾ(•ω•`)o!

Thanks for reading!

【C++复习】栈-上篇

Tue Aug 20 2024
1443 字 · 8 分钟