在C语言中,栈(Stack)通常可以使用数组或链表来实现。这里,我将给出使用数组来实现栈的示例,并提供栈的基本操作:初始化栈、判断栈是否为空、入栈、出栈以及获取栈顶元素。
栈的定义
首先,我们需要定义一个结构体来表示栈,并包含栈顶指针、栈的大小以及存储数据的数组。
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <stdbool.h> |
|
|
|
#define MAX_STACK_SIZE 100 // 定义栈的最大容量 |
|
|
|
typedef struct { |
|
int top; // 栈顶指针,-1表示栈为空 |
|
int capacity; // 栈的最大容量 |
|
int* array; // 存放栈元素的数组 |
|
} Stack; |
栈的初始化
初始化栈时,需要为数组分配内存,并设置栈顶指针为-1(表示空栈)。
|
Stack* createStack(int capacity) { |
|
Stack* stack = (Stack*)malloc(sizeof(Stack)); |
|
if (!stack) { |
|
exit(1); // 内存分配失败 |
|
} |
|
stack->capacity = capacity; |
|
stack->top = -1; |
|
stack->array = (int*)malloc(stack->capacity * sizeof(int)); |
|
if (!stack->array) { |
|
free(stack); |
|
exit(1); // 内存分配失败 |
|
} |
|
return stack; |
|
} |
判断栈是否为空
通过检查栈顶指针是否为-1来判断栈是否为空。
|
bool isEmpty(Stack* stack) { |
|
return stack->top == -1; |
|
} |
入栈操作
入栈操作将新元素放在栈顶,并更新栈顶指针。
|
bool push(Stack* stack, int data) { |
|
if (stack->top == stack->capacity - 1) { |
|
// 栈已满,无法入栈 |
|
return false; |
|
} |
|
stack->array[++stack->top] = data; // 先增加栈顶指针,再存放数据 |
|
return true; |
|
} |
出栈操作
出栈操作移除栈顶元素,并返回该元素的值。同时更新栈顶指针。
|
bool pop(Stack* stack, int* data) { |
|
if (isEmpty(stack)) { |
|
// 栈为空,无法出栈 |
|
return false; |
|
} |
|
*data = stack->array[stack->top--]; // 先取出数据,再减少栈顶指针 |
|
return true; |
|
} |
获取栈顶元素
获取栈顶元素但不移除它。
|
bool peek(Stack* stack, int* data) { |
|
if (isEmpty(stack)) { |
|
// 栈为空 |
|
return false; |
|
} |
|
*data = stack->array[stack->top]; |
|
return true; |
|
} |
销毁栈
销毁栈时,需要释放栈所使用的内存。
|
void destroyStack(Stack* stack) { |
|
if (stack) { |
|
free(stack->array); |
|
free(stack); |
|
} |
|
} |
测试栈的功能
|
int main() { |
|
Stack* stack = createStack(MAX_STACK_SIZE); |
|
|
|
push(stack, 1); |
|
push(stack, 2); |
|
push(stack, 3); |
|
|
|
int topElement; |
|
peek(stack, &topElement); |
|
printf("Top element is: %d\n", topElement); |
|
|
|
pop(stack, &topElement); |
|
printf("Popped element is: %d\n", topElement); |
|
|
|
peek(stack, &topElement); |
|
printf("Top element is: %d\n", topElement); |
|
|
|
destroyStack(stack); |
|
return 0; |
|
} |
上述代码展示了如何使用数组来实现栈,并提供了栈的基本操作。需要注意的是,这种实现方式在栈的大小超过MAX_STACK_SIZE时会失败。在实际应用中,可能需要根据具体需求来选择是否使用动态调整大小的栈。此外,栈在实际应用中还可能涉及异常处理、线程安全等问题,这些在上面的简单示例中并未涉及。