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::vector
或std::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的用法。关注我,为大家持续分享更多的内容,让学习变得更简单,与君共勉,共同成长。