STL之stack 【栈】

stack:栈,后进先出(LIFO)的数据结构。适用于需要在容器的末尾执行插入和删除操作的情况.

头文件

#include <stack>

创建stack

std::stack<int> myStack;  // 创建一个整数类型的栈

添加元素(插入元素)

myStack.push(42);
myStack.push(17);

删除元素(弹出元素)

myStack.pop();  // 弹出顶部元素

访问元素

使用 top 函数访问栈的顶部元素,但不会从栈中移除它:

int topElement = myStack.top();  // 访问栈顶部元素

检查栈是否为空:

if (myStack.empty()) {
   
    std::cout << "Stack is empty." << std::endl;
} else {
   
    std::cout << "Stack is not empty." << std::endl;
}

获取栈的大小

size_t stackSize = myStack.size();  // 获取栈的大小
#include <iostream>
#include <stack>

int main() {
   
    std::stack<int> myStack;

    myStack.push(42);
    myStack.push(17);

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

    myStack.pop();

    if (myStack.empty()) {
   
        std::cout << "Stack is empty." << std::endl;
    } else {
   
        std::cout << "Stack is not empty." << std::endl;
    }

    return 0;
}

遍历C++中stack

在C++的STL中,std::stack并没有提供公开的迭代器接口,因此无法直接通过迭代器来遍历栈。实际上,std::stack设计为在特定情况下隐藏了其底层容器的实现细节,并且它的迭代器是被封装的,无法直接访问。如果你需要遍历栈中的元素,最好的方法是将栈的内容弹出到一个临时容器(如std::vectorstd::deque)中,然后使用该容器的迭代器进行遍历。

#include <iostream>
#include <stack>
#include <vector>

int main() {
   
    std::stack<int> myStack;
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 将栈中的元素弹出并存储到vector中
    std::vector<int> tempVector;
    while (!myStack.empty()) {
   
        tempVector.push_back(myStack.top());
        myStack.pop();
    }

    // 使用vector的迭代器从栈顶到栈底遍历
    std::cout << "Stack elements from top to bottom: ";
    for (auto it = tempVector.rbegin(); it != tempVector.rend(); ++it) {
   
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

用c语言实现栈

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
   
    int arr[MAX_SIZE];
    int top;
} Stack;

// 初始化栈
void initializeStack(Stack* stack) {
   
    stack->top = -1;
}

// 判断栈是否为空
int isEmpty(Stack* stack) {
   
    return stack->top == -1;
}

// 判断栈是否已满
int isFull(Stack* stack) {
   
    return stack->top == MAX_SIZE - 1;
}

// 入栈操作
void push(Stack* stack, int value) {
   
    if (isFull(stack)) {
   
        printf("Stack overflow\n");
        return;
    }

    stack->arr[++(stack->top)] = value;
}

// 出栈操作
int pop(Stack* stack) {
   
    if (isEmpty(stack)) {
   
        printf("Stack underflow\n");
        return -1; // 表示栈为空
    }

    return stack->arr[(stack->top)--];
}

// 获取栈顶元素,不弹出
int peek(Stack* stack) {
   
    if (isEmpty(stack)) {
   
        printf("Stack is empty\n");
        return -1; // 表示栈为空
    }

    return stack->arr[stack->top];
}

int main() {
   
    Stack myStack;
    initializeStack(&myStack);

    push(&myStack, 10);
    push(&myStack, 20);
    push(&myStack, 30);

    printf("Top element: %d\n", peek(&myStack));

    printf("Popped element: %d\n", pop(&myStack));
    printf("Popped element: %d\n", pop(&myStack));

    printf("Top element: %d\n", peek(&myStack));

    return 0;
}

那么stack的用法就讲到这里,下一章看multiset的用法。关注我,为大家持续分享更多的内容,让学习变得更简单,与君共勉,共同成长。

相关推荐

  1. STLstack

    2024-01-30 14:52:02       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-30 14:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-30 14:52:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-30 14:52:02       82 阅读
  4. Python语言-面向对象

    2024-01-30 14:52:02       91 阅读

热门阅读

  1. VA_LIST可变参数列表使用学习

    2024-01-30 14:52:02       53 阅读
  2. 正则表达式 grep

    2024-01-30 14:52:02       52 阅读
  3. STM32 1-5

    STM32 1-5

    2024-01-30 14:52:02      45 阅读
  4. 【iOS ARKit】光照效果--光源

    2024-01-30 14:52:02       52 阅读
  5. C. Did We Get Everything Covered?

    2024-01-30 14:52:02       56 阅读
  6. k8s默认seccomp禁用研究

    2024-01-30 14:52:02       62 阅读