栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构。它支持两种主要操作:
- 入栈(Push):将元素添加到栈的顶部。
- 出栈(Pop):从栈的顶部移除元素。
以下是使用C语言实现一个简单的栈的代码:
栈的实现
#include
#include
#define MAX_SIZE 100 // 定义栈的最大容量
// 定义栈结构
typedef struct {
int items[MAX_SIZE]; // 存储栈元素的数组
int top; // 栈顶指针
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1; // 栈顶指针初始化为-1,表示栈为空
}
// 检查栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 检查栈是否已满
int isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *s, int value) {
if (isFull(s)) {
printf("栈已满,无法入栈!\n");
return;
}
s->top++; // 栈顶指针上移
s->items[s->top] = value; // 将元素添加到栈顶
printf("入栈元素:%d\n", value);
}
// 出栈操作
int pop(Stack *s) {
if (isEmpty(s)) {
printf("栈为空,无法出栈!\n");
return -1; // 返回-1表示栈为空
}
int value = s->items[s->top]; // 获取栈顶元素
s->top--; // 栈顶指针下移
printf("出栈元素:%d\n", value);
return value;
}
// 获取栈顶元素(不删除)
int peek(Stack *s) {
if (isEmpty(s)) {
printf("栈为空,无栈顶元素!\n");
return -1; // 返回-1表示栈为空
}
return s->items[s->top];
}
// 打印栈内容
void printStack(Stack *s) {
if (isEmpty(s)) {
printf("栈为空!\n");
return;
}
printf("栈内容(从栈顶到栈底):");
for (int i = s->top; i >= 0; i--) {
printf("%d ", s->items[i]);
}
printf("\n");
}
int main() {
Stack s;
initStack(&s); // 初始化栈
push(&s, 10); // 入栈10
push(&s, 20); // 入栈20
push(&s, 30); // 入栈30
printStack(&s); // 打印栈内容
pop(&s); // 出栈
printStack(&s); // 打印栈内容
printf("栈顶元素:%d\n", peek(&s)); // 获取栈顶元素
pop(&s); // 出栈
pop(&s); // 出栈
pop(&s); // 尝试从空栈出栈
return 0;
}
代码说明
- 栈结构:
使用数组 items 存储栈元素。
top 表示栈顶的索引。
- 初始化栈:
将 top 初始化为 -1,表示栈为空。
- 入栈操作:
检查栈是否已满。
将元素添加到栈顶,并更新 top。
- 出栈操作:
检查栈是否为空。
获取栈顶元素,并更新 top。
- 获取栈顶元素:
返回栈顶元素的值,但不删除它。
- 打印栈内容:
从栈顶到栈底遍历并打印所有元素。
- 主函数:
初始化栈。
进行入栈和出栈操作,并打印栈内容。
示例输出
入栈元素:10
入栈元素:20
入栈元素:30
栈内容(从栈顶到栈底):30 20 10
出栈元素:30
栈内容(从栈顶到栈底):20 10
栈顶元素:20
出栈元素:20
出栈元素:10
栈为空,无法出栈!
总结
- 该实现使用数组存储栈元素,适合固定大小的栈。
- 如果需要动态扩展栈大小,可以使用链表实现。
- 栈的入栈和出栈操作的时间复杂度均为 O(1)。