栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。它只允许在栈顶进行添加(push)或删除(pop)元素的操作。栈是一种非常基础且重要的数据结构,在计算机科学中广泛应用,如函数调用、递归实现、浏览器历史记录管理等。
栈的基本操作
- push(x): 将元素x压入栈顶。
- pop(): 移除栈顶元素,并返回该元素。如果栈为空,则可能引发错误或返回特殊值(如NULL)。
- peek() 或 top(): 返回栈顶元素,但不从栈中移除它。
- isEmpty(): 检查栈是否为空。
- size(): 返回栈中元素的数量。
栈的C语言实现
下面是一个简单的栈的C语言实现,使用数组来存储栈中的元素,并维护一个表示栈顶位置的索引。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100 // 定义栈的最大容量
typedef struct {
int items[MAX_SIZE]; // 存储栈元素的数组
int top; // 栈顶元素的索引
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1; // 栈为空时,栈顶索引为-1
}
// 检查栈是否为空
bool isEmpty(Stack *s) {
return s->top == -1;
}
// 检查栈是否已满
bool isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈操作
bool push(Stack *s, int item) {
if (isFull(s)) {
printf("Stack is full!\n");
return false;
}
s->items[++s->top] = item; // 先增加栈顶索引,再赋值
return true;
}
// 出栈操作
bool pop(Stack *s, int *item) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return false;
}
*item = s->items[s->top--]; // 先赋值,再减少栈顶索引
return true;
}
// 查看栈顶元素
bool peek(Stack *s, int *item) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return false;
}
*item = s->items[s->top];
return true;
}
// 打印栈中所有元素
void printStack(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return;
}
for (int i = s->top; i >= 0; i--) {
printf("%d ", s->items[i]);
}
printf("\n");
}
int main() {
Stack s;
initStack(&s);
push(&s, 10);
push(&s, 20);
printStack(&s); // 输出: 20 10
int topElement;
if (peek(&s, &topElement)) {
printf("Top element is: %d\n", topElement); // 输出: Top element is: 20
}
int poppedElement;
if (pop(&s, &poppedElement)) {
printf("Popped element is: %d\n", poppedElement); // 输出: Popped element is: 20
}
printStack(&s); // 输出: 10
return 0;
}
这段代码定义了一个名为Stack
的结构体,包含了一个整型数组items
用于存储栈中的元素,以及一个整型top
用于表示栈顶元素的索引。此外,还实现了栈的基本操作函数,包括初始化栈、检查栈是否为空或已满、入栈、出栈、查看栈顶元素以及打印栈中所有元素。最后,main
函数中展示了如何使用这些函数来操作栈。