栈(Stack)教学资料

目录

1. 栈的基本概念

2. 栈的操作

3. 栈的实现

4.C++ 实现栈

1. 使用 C++ STL 实现栈

2. 手动实现栈(基于数组)

5. 栈的复杂度分析

6. 栈的扩展

7. 练习题

练习1.

练习2.

练习3.

8. 总结


1. 栈的基本概念


栈(Stack)是一种常见的数据结构,它遵循后进先出(LIFO, Last In First Out)的原则。这意味着最后进入栈的元素会最先被取出。栈的操作主要发生在栈的顶部。

2. 栈的操作


栈的基本操作包括:

Push(入栈):将元素添加到栈的顶部

Pop(出栈):移除并返回栈顶的元素

Peek/Top(查看栈顶元素):返回栈顶的元素但不移除它。

IsEmpty(判断栈是否为空):检查栈是否为空。

Size(获取栈的大小):返回栈中元素的数量。

3. 栈的实现


栈可以通过数组或链表来实现。以下是使用Python列表实现栈的示例:

python:

class Stack:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return len(self.items) == 0

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if self.is_empty():
            raise IndexError("pop from empty stack")
        return self.items.pop()

    def peek(self):
        if self.is_empty():
            raise IndexError("peek from empty stack")
        return self.items[-1]

    def size(self):
        return len(self.items)

4.C++ 实现栈


在 C++ 中,栈可以通过标准模板库(STL)中的 std::stack 来实现,也可以手动使用数组或链表来实现。以下是两种方式的示例:

1. 使用 C++ STL 实现栈

#include 
#include 
using namespace std;

int main() {
    stack s;

    // 入栈
    s.push(1);
    s.push(2);
    s.push(3);

    // 查看栈顶元素
    cout << "栈顶元素: " << s.top() << endl; // 输出: 3

    // 出栈
    s.pop();
    cout << "出栈后栈顶元素: " << s.top() << endl; // 输出: 2

    // 判断栈是否为空
    if (s.empty()) {
        cout << "栈为空" << endl;
    } else {
        cout << "栈不为空" << endl;
    }

    // 获取栈的大小
    cout << "栈的大小: " << s.size() << endl; // 输出: 2

    return 0;
}


C++ 的 STL 提供了 std::stack,可以直接使用:

2. 手动实现栈(基于数组)


以下是手动实现栈的 C++ 代码:

#include 
using namespace std;

class Stack {
private:
    static const int MAX_SIZE = 100; // 栈的最大容量
    int items[MAX_SIZE]; // 用数组存储栈元素
    int topIndex; // 栈顶指针

public:
    Stack() : topIndex(-1) {}

    // 判断栈是否为空
    bool isEmpty() {
        return topIndex == -1;
    }

    // 判断栈是否已满
    bool isFull() {
        return topIndex == MAX_SIZE - 1;
    }

    // 入栈
    void push(int item) {
        if (isFull()) {
            cout << "栈已满,无法入栈" << endl;
            return;
        }
        items[++topIndex] = item;
    }

    // 出栈
    int pop() {
        if (isEmpty()) {
            cout << "栈为空,无法出栈" << endl;
            return -1; // 返回一个无效值
        }
        return items[topIndex--];
    }

    // 查看栈顶元素
    int peek() {
        if (isEmpty()) {
            cout << "栈为空" << endl;
            return -1; // 返回一个无效值
        }
        return items[topIndex];
    }

    // 获取栈的大小
    int size() {
        return topIndex + 1;
    }
};

int main() {
    Stack s;

    s.push(1);
    s.push(2);
    s.push(3);

    cout << "栈顶元素: " << s.peek() << endl; // 输出: 3
    cout << "出栈元素: " << s.pop() << endl;  // 输出: 3
    cout << "栈顶元素: " << s.peek() << endl; // 输出: 2
    cout << "栈的大小: " << s.size() << endl; // 输出: 2

    return 0;
}

5. 栈的复杂度分析


push:O(1)

pop:O(1)

peek:O(1)

isEmpty:O(1)

size:O(1)

6. 栈的扩展


双栈:在某些情况下,可以使用两个栈来实现更复杂的功能,例如实现一个队列。

最小栈:可以在栈的基础上实现一个能够快速获取最小元素的栈。

7. 练习题


练习1.

实现一个栈,并编写代码检查一个字符串中的括号是否匹配。

练习2.

使用栈实现一个简单的计算器,能够处理加减乘除运算。

练习3.

实现一个能够返回栈中最小元素的栈,要求所有操作的时间复杂度为O(1)。

练习4.

洛谷【栈】

8. 总结


栈是一种简单但功能强大的数据结构,理解栈的基本操作和应用场景对于学习算法和数据结构非常重要。通过练习和实践,可以更好地掌握栈的使用方法。

你可能感兴趣的:(python,开发语言,数据结构,线性回归)