在C语言中,stack
的使用主要分为两种方式:使用标准模板库(STL)和自定义实现。以下是具体说明:
一、使用STL中的stack
(推荐)
-
包含头文件
需包含
<stack>
头文件,并使用std::stack
命名空间。 -
基本操作
-
定义 :
std::stack<T> st;
(T
为数据类型)。 -
入栈 :
st.push(x);
(时间复杂度O(1))。 -
出栈 :
st.pop();
(时间复杂度O(1))。 -
获取栈顶元素 :
int top = st.top();
(时间复杂度O(1))。 -
判断是否为空 :
bool empty = st.empty();
(时间复杂度O(1))。 -
获取栈大小 :
int size = st.size();
(时间复杂度O(1))。
-
-
示例代码
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st; for(int i=1; i<=5; i++) st.push(i); while(!st.empty()) { cout << st.top() << " "; st.pop(); } return 0; }
输出:
5 4 3 2 1
。
二、自定义实现(底层操作)
-
结构定义
使用数组模拟栈,需手动管理内存。例如:
#define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int top; } Stack;
-
核心函数
-
初始化 :
void init(Stack *stack) { stack->top = -1; }
。 -
入栈 :
void push(Stack *stack, int value)
(检查溢出)。 -
出栈 :
int pop(Stack *stack)
(检查下溢)。 -
获取栈顶元素 :
int peek(Stack *stack)
(检查空栈)。 -
判断是否为空 :
bool empty(Stack *stack)
。 -
获取栈大小 :
int size(Stack *stack)
。
-
-
示例代码
#include <stdio.h> #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int top; } Stack; void init(Stack *stack) { stack->top = -1; } bool empty(Stack *stack) { return stack->top == -1; } void push(Stack *stack, int value) { if (stack->top >= MAX_SIZE - 1) printf("Stack overflow!\n"); stack->data[++stack->top] = value; } int pop(Stack *stack) { if (empty(stack)) printf("Stack underflow!\n"); return stack->data[stack->top--]; } int peek(Stack *stack) { if (empty(stack)) printf("Stack is empty!\n"); return stack->data[stack->top]; } int size(Stack *stack) { return stack->top + 1; } int main() { Stack st; init(&st); push(&st, 1); push(&st, 2); // 栈内容:1, 2 printf("Top element: %d\n", peek(&st)); // 输出2 printf("Popped element: %d\n", pop(&st)); // 输出2 printf("Stack size: %d\n", size(&st)); // 输出1 return 0; }
总结
-
STL实现 :简洁易用,适合快速开发,但仅支持基本数据类型。
-
自定义实现 :灵活支持任意数据类型,但需手动管理内存,适合复杂场景。
根据需求选择合适方式,优先推荐使用STL的stack
容器。