动态数组实现堆栈

本文介绍了一个使用C语言实现的动态栈数据结构,包括创建、销毁、压栈、弹栈等核心操作,并通过一个简单的测试案例展示了其基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dy_stack.h

#define STACK_TYPE char

 

extern void push(STACK_TYPE value);

extern void pop(void);

extern STACK_TYPE top(void);

int is_empty();

int is_full();

 

extern void create_stack(int size);//unsigned int

extern void destroy_stack();

 

dy_stack.c

#include "dy_stack.h"

#include <assert.h>

#include <malloc.h>

#include <stdio.h>

 

 

//#define STACK_SIZE   100 /*堆栈中数值的最大限制*/

 

//存储堆栈中的数组和一个指向堆栈顶部元素的指针

//所有不属于外部接口的内容都被声明为static,这可防止用户使用

//预定义接口之外的任何方式访问堆栈的值

static int stack_size = 0;

static STACK_TYPE *stack;

static int top_element = -1;

 

void create_stack(int size)

{

       assert(stack_size == 0);

       stack_size = size;

       stack = malloc(stack_size * sizeof(STACK_TYPE));

       assert(stack != NULL);

}

 

void destroy_stack(void)

{

       assert(stack_size > 0);

       stack_size = 0;

       free(stack);

       stack = (STACK_TYPE *)NULL;

}

 

int is_empty()

{

       assert(stack_size > 0);

       return top_element == -1;

}

 

int is_full()

{

       assert(stack_size > 0);

       return top_element == stack_size - 1;

}

 

void push(STACK_TYPE value)

{

       assert(!is_full());

 

       top_element += 1;

       stack[top_element] = value;

}

 

void pop()

{

       assert(!is_empty());

       top_element -= 1;

}

 

STACK_TYPE top()

{

       assert(!is_empty());

       return stack[top_element];

}

 

test.c

#include "dy_stack.h"

#include <stdio.h>

 

void main()

{

       create_stack(100);

 

       push('a');

       push('b');

       push('c');

       push('d');

       push('e');

 

       pop();

       pop();

 

       printf("top = %c/n", top());

}

### C语言使用数组实现堆栈数据结构 #### 定义堆栈结构体 为了方便管理和操作,定义一个`Stack`结构体来表示堆栈。该结构体包含指向存储元素的指针、当前栈顶位置以及容量。 ```c typedef int STDataType; typedef struct Stack { STDataType* arr; int top; // 栈顶的位置 int capacity; // 堆栈的最大容量 } Stack; ``` #### 初始化堆栈 创建一个新的堆栈实例并分配内存空间给它。设置初始状态下的top为-1,意味着此时堆栈为空[^3]。 ```c void StackInit(Stack* ps) { assert(ps); ps->capacity = 4; ps->arr = (STDataType*)malloc(sizeof(STDataType) * ps->capacity); if (!ps->arr) exit(-1); memset(ps->arr, 0, sizeof(STDataType) * ps->capacity); ps->top = -1; } ``` #### 销毁堆栈 当不再需要某个特定的堆栈对象时,应该释放其占用的空间资源以防止泄漏。 ```c void StackDestroy(Stack* ps) { free(ps->arr); ps->arr = NULL; ps->capacity = 0; ps->top = -1; } ``` #### 扩展堆栈容量 如果尝试向已满的堆栈中添加新元素,则需增加堆栈大小以便容纳更多项。 ```c static void _StackExpand(Stack* ps){ int newCapacity = ps->capacity * 2; STDataType* tmp = realloc(ps->arr,sizeof(STDataType)*newCapacity); if(!tmp) exit(-1); ps->arr=tmp; ps->capacity=newCapacity; } ``` #### 插入元素到堆栈顶端(压栈) 将指定类型的值推送到现有堆栈顶部之前检查是否有足够的可用空间;如果没有则调用扩展方法。 ```c void StackPush(Stack* ps, STDataType data) { if (ps->top + 1 == ps->capacity)_StackExpand(ps); ps->arr[++(ps->top)] = data; } ``` #### 移除最上面的一个元素(弹栈) 移除位于堆栈顶部最近加入的那个项目,并返回它的值。注意,在执行此操作前要确认堆栈不是空的状态。 ```c void StackPop(Stack* ps) { if (ps->top == -1)return; --(ps->top); } ``` #### 获取堆栈顶部元素而不删除它 读取但不改变堆栈中最顶层项目的实际内容。 ```c STDataType StackTop(const Stack* ps) { if (ps->top == -1)exit(-1); return ps->arr[ps->top]; } ``` #### 判断堆栈是否为空 提供一种方式快速检测当前堆栈里是否存在任何有效条目。 ```c bool StackEmpty(const Stack* ps) { return ps->top == -1 ? true : false; } ``` #### 查询堆栈内元素数量 计算自底部至顶部之间所有成员的数量总和。 ```c intStackSize(const Stack* ps) { return ps->top + 1; } ``` 以上就是完整的基于C语言利用数组构建基本功能齐全的堆栈类库的过程描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值