
前言
今天我想和大家聊聊一个程序员最亲密的伙伴之一,那就是——栈!
可能有些小伙伴已经熟悉了栈这个数据结构,但是如果你还不了解栈,没关系,我会用通俗易懂的语言为大家介绍它的定义、应用以及实现方法。希望大家会喜欢这篇文章。
一、栈的介绍
栈,它的定义非常简单:栈是一种储存数据的容器,只能访问最后一个添加进去的元素,也就是“后进先出”(Last In First Out,LIFO)。
可能有人会问,这样一个简单的数据结构有什么用呢?其实,栈在计算机科学中有着广泛的应用。比如,当你使用浏览器浏览网页时,每打开一个新页面,都会将这个页面的 URL 压入栈中。当你点击“返回”按钮时,浏览器会从栈中弹出最新的 URL,然后显示上一个页面。这就是一个栈的应用。
在程序中,栈也非常常见。比如,在递归函数中,每次函数调用都会将参数和返回地址压入栈中。当函数执行完毕后,它会从栈中弹出返回地址,然后返回到上一层调用的函数。
当然,我们也可以用栈来实现其他数据结构,比如队列。只需要使用两个栈,一个用于入队,一个用于出队,就可以实现先进先出的队列。
二、栈的实现
栈的实现还是很简单的
Stack.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int STDateType;
#define INIT 10
typedef struct Stack
{
STDateType* a;
int top;
int capacity;
}ST;
//初始化
void StackInit(ST* ps);
//销毁
void StackDestroy(ST* ps);
//压栈
void StackPush(ST* ps, STDateType x);
//出栈
void StackPop(ST* ps);
//查看栈顶元素
STDateType StackTop(ST* ps);
//查看栈的大小
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);
Stack.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"
void StackInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
void StackPush(ST* ps, STDateType x)
{
assert(ps);
//扩容
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 10 : ps->capacity * 2;
STDateType* tmp = (STDateType*)realloc(ps->a, sizeof(STDateType)*newcapacity);
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a = tmp;
ps->capacity = newcapacity;
}
ps->a[ps->top++] = x;
}
void StackPop(ST* ps)
{
assert(ps);
if (ps->top == 0)
{
printf("栈为空, 无需删除\n");
exit(-1);
}
ps->top--;
}
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
}
STDateType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->a[ps->top - 1];
}
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
Text.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"
void test()
{
ST s;
StackInit(&s);
StackPush(&s, 1);
StackPush(&s, 2);
StackPush(&s, 3);
StackPush(&s, 4);
StackPush(&s, 5);
printf("%d ", StackTop(&s));
StackPop(&s);
printf("%d ", StackTop(&s));
StackPop(&s);
while (!StackEmpty(&s))
{
printf("%d ", StackTop(&s));
StackPop(&s);
}
//StackPop(&s);
//StackPop(&s);
//StackPop(&s);
StackDestroy(&s);
}
int main(void)
{
test();
return 0;
}
栈是一种后进先出(LIFO)的数据结构,常用于浏览器历史记录、递归函数等场景。本文介绍了栈的基本概念,以及如何使用C语言实现一个简单的栈,包括初始化、压栈、出栈等操作。


5007

被折叠的 条评论
为什么被折叠?



