栈简介
栈(Stack)是一种后进先出的数据结构,类似于一个垂直的容器。
栈的特点是后进先出,即最后入栈的元素最先出栈。栈可以用来解决递归问题、实现函数调用、以及存储临时数据等。
例如,在计算机科学中,栈常用于实现函数调用栈,记录函数调用的顺序和参数。
希望本文通过使用C语言实现栈操作可以帮助读者理解栈的基本原理。
栈的C实现
1.栈结构体
想要实现栈结构,我们就要对其分配空间,可以使用结构体来实现。
结构体包含的此栈空间的起始地址、栈尺寸、栈顶元素。
如下:
//栈结构体
typedef struct Stack {
int *data; // 栈内元素指针
int top; // 栈顶元素索引
int size; // 栈尺寸
} Stack;
2.初始化栈
有了栈结构后,我们在使用栈之前还要进行初始化。
初始化操作有分配一个栈结构体、分配指定大小的内存空间存储栈数据。
如下:
// 初始化栈
Stack* initStack(int size)
{
Stack *stack = (Stack *)malloc(sizeof(Stack)); // 分配栈结构体并获取结构体指针
stack->data = (int *)malloc(size * sizeof(int)); // 为栈内元素分配有size个int类型元素的空间,并将地址赋值给栈内元素指针
stack->top = -1; // 初始化栈顶元素索引为-1,表示栈空
stack->size = size; // 初始化栈尺寸为实际大小(即传入的size大小)
return stack; // 返回栈结构体指针
}
3.栈的基本操作
// 入栈
void push(Stack *stack, int value)
{
if (stack->top < stack->size - 1) // 判断栈是否已满
{
stack->data[++stack->top] = value; //将栈顶索引加1,并将数据插入栈顶
}
else
{
printf("栈已满,无法入栈!\n");
}
}
// 出栈
int pop(Stack *stack)
{
if (stack->top >= 0) // 判断栈是否为空
{
return stack->data[stack->top--]; // 从栈顶获取数据,并将栈顶索引减1
}
else
{
printf("栈为空,无法出栈!\n");
return -1; // 或者返回异常
}
}
// 获取栈顶元素
int top(Stack *stack)
{
if (stack->top >= 0) // 判断栈是否为空
{
return stack->data[stack->top]; // 从栈顶获取数据
}
else
{
printf("栈为空,无法获取栈顶元素!\n");
return -1; // 或者返回异常
}
}
// 将栈设置为空
int setEmpty(Stack *stack)
{
return stack->top == -1;
}
// 释放栈资源
void freeStack(Stack *stack)
{
free(stack->data);
free(stack);
}
以上就是用C实现的栈的基本操作,
当然栈还有共享栈、链栈等,但本文介绍到的操作也是提到的这两种栈操作的基本,读者可以尝试着在此基础上实现共享栈与链栈的操作。