C++栈的知识点

C++栈的知识点_第1张图片

今天,我们来了解一下栈!

目录

1.什么是栈?

2.栈能干什么?

3.栈的输入与输出

4.栈的插入!

5.总结


1.什么是栈?

栈是一种数据结构,用于存储和管理数据。它遵循先进后出(LIFO)的原则,即最后放入栈的元素最先被取出。栈通常有两个主要操作:压栈(将元素放入栈)和出栈(从栈中取出元素)。

在C++中,可以使用数组或链表等数据结构来实现栈。C++标准库中还提供了一个模板类std::stack,用于实现栈的功能。可以通过包含头文件来使用该类。

以下是使用std::stack实现栈的示例代码:
 

#include 
#include 

int main() {
    std::stack myStack;

    // 压栈
    myStack.push(1);
    myStack.push(2);
    myStack.push(3);

    // 出栈
    while (!myStack.empty()) {
        std::cout << myStack.top() << " ";
        myStack.pop();
    }

    return 0;
}

上述代码将输出:3 2 1,因为最后放入栈的元素最先被取出。

2.栈能干什么?

在C++中,栈可以用于以下功能:

1. 函数调用:在函数调用过程中,局部变量、参数和返回地址等信息都是通过栈来保存和管理的。每当一个函数被调用时,它的局部变量和参数都会被压入栈中,当函数执行完毕后,这些数据会被弹出栈。

2. 表达式求值:栈可以用于求解数学表达式,如中缀表达式转后缀表达式、后缀表达式的计算等。在这个过程中,运算符和操作数都可以通过栈来进行存储和处理。

3. 内存分配:栈也可以用于局部变量的内存分配。在函数执行过程中,局部变量的内存空间会被分配在栈的顶部,当函数执行完毕后,这些内存空间会被自动释放。

4. 符号匹配:栈可以用于检查符号(如括号、花括号、方括号等)是否匹配。每当遇到一个左符号时,就将其压入栈中;当遇到一个右符号时,就弹出栈顶元素并检查是否匹配。

5. 递归函数:递归函数的执行过程也可以通过栈来实现。每当一个函数调用自身时,就会将函数调用的信息(如参数、返回地址等)压入栈中,直到达到递归终止条件。

总之,栈在程序设计中非常常用,可以帮助解决许多与数据存储和处理相关的问题。

3.栈的输入与输出

栈的输入是通过将元素依次压入栈顶实现的,而输出是通过弹出栈顶元素实现的。下面以C++为例,详细介绍栈的输入与输出的步骤以及注意事项。

C++栈的知识点_第2张图片

1. 导入头文件:在使用栈前,需要导入相应的头文件。

#include 
#include 


 

2. 创建栈对象:使用stack模板类创建一个栈对象。

std::stack stackObj;


 

3. 入栈操作:使用push()函数将元素压入栈顶。


 

stackObj.push(10);
stackObj.push(20);
stackObj.push(30);

4. 判断栈是否为空:可以使用empty()函数来判断栈是否为空。


 

if (stackObj.empty()) {
    std::cout << "栈为空" << std::endl;
} else {
    std::cout << "栈不为空" << std::endl;
}

5. 获取栈顶元素:使用top()函数可以获取栈顶元素,但不会将元素弹出。

int topElement = stackObj.top();
std::cout << "栈顶元素为:" << topElement << std::endl;


 

6. 出栈操作:使用pop()函数可以将栈顶元素弹出栈。

stackObj.pop();


 

7. 输出栈中的所有元素:由于栈是一种封闭的数据结构,只能从栈顶访问元素,因此输出栈中的所有元素需要先将栈中的元素逐个弹出。


 

while (!stackObj.empty()) {
    int element = stackObj.top();
    std::cout << element << " ";
    stackObj.pop();
}
std::cout << std::endl;

注意事项:
1. 在使用栈前,需要导入相应的头文件。
2. 栈中存储的元素类型可以是基本类型(如int、char等)或自定义类型。
3. push()函数将元素压入栈顶,pop()函数将栈顶元素弹出。
4. empty()函数判断栈是否为空,top()函数获取栈顶元素。
5. 注意在操作栈时需要判断栈是否为空,否则可能会出现越界访问的错误。

4.栈的插入!

在C++中,可以使用std::stack来表示栈,其插入操作是通过std::stack的成员函数push()来完成的。

下面是一些示例,展示了栈的插入操作在不同情况下的使用:

1.头部插入:


 

#include 
#include 

int main() {
    std::stack myStack;
    
    myStack.push(3); // 插入3
    myStack.push(2); // 插入2
    myStack.push(1); // 插入1
    
    std::cout << "栈顶元素:" << myStack.top() << std::endl; // 输出:栈顶元素:1
    
    return 0;
}

2.中间插入:

栈的插入操作只能在栈顶进行,因此不存在在中间插入元素的情况。

3.尾部插入:

#include 
#include 

int main() {
    std::stack myStack;
    
    myStack.push(1); // 插入1
    myStack.push(2); // 插入2
    myStack.push(3); // 插入3
    
    std::cout << "栈顶元素:" << myStack.top() << std::endl; // 输出:栈顶元素:3
    
    return 0;
}

注意事项:
1. 栈的插入操作只能在栈顶进行,即只能插入到已有元素的上方。
2. 在C++中,std::stack使用模板实现,可以存储任意类型的元素。在上述示例中,我们使用int类型进行演示。

5.总结

在C++中,栈的主要操作包括:

1. 入栈(Push):在栈顶插入一个元素,将栈顶指针向上移动一位。
2. 出栈(Pop):删除栈顶元素,将栈顶指针向下移动一位。
3. 取栈顶(Top):获取栈顶元素的值,不改变栈的状态。
4. 判空(Empty):判断栈是否为空,即栈中是否有元素。
5. 获取栈大小(Size):获取栈中元素的个数。

C++ 的 std::stack 类是一个模板类,可以通过指定数据类型来创建栈。例如,std::stack 创建一个存储 int 类型的栈。

下面是一个使用 C++ 标准库中的栈实现的示例代码:
 

#include 
#include 

int main() {
    std::stack myStack;

    // 入栈
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 出栈
    myStack.pop();

    // 取栈顶
    int topElement = myStack.top();
    std::cout << "Top element: " << topElement << std::endl;

    // 判空
    bool isEmpty = myStack.empty();
    std::cout << "Is stack empty? " << (isEmpty ? "Yes" : "No") << std::endl;

    // 获取栈大小
    int size = myStack.size();
    std::cout << "Stack size: " << size << std::endl;

    return 0;
}

上述代码首先创建了一个 std::stack对象 myStack。然后通过 push()方法将元素 10、20 和 30 分别入栈,再通过 pop() 方法将栈顶元素 30 出栈。

接着使用 top() 方法获取栈顶元素的值,并输出到控制台。然后使用 empty() 方法判断栈是否为空,并输出结果。最后使用 size()`方法获取栈的大小,并输出结果。

输出结果为:
Top element: 20
Is stack empty? No
Stack size: 2

这就是使用 C++ 标准库中的栈的基本操作。栈在算法中有很多应用,如深度优先搜索(DFS)和函数调用堆栈等。

感谢大家观看与支持!!

你可能感兴趣的:(C++干货专栏,c++,java,算法)