目录
1.栈的基本概念:
2. 栈的基本功能:
3.栈的实现:
3.1 存储结构:(顺序表)
3.2 初始化:(void StackInit(stack*tmp))
3.3 栈的销毁:(void StackDestroy(stack*tmp))
3.4 入栈:(void StackPush(stack*tmp,StackDataType x))
3.5 出栈:(void StackPop(stack*tmp))
4.实现代码:
1.栈的基本概念:
栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的数据结构。在栈中,元素的添加和移除都发生在同一端,这一端通常被称为栈顶(Top)。栈底(Bottom)是栈的另一端,通常元素不会从栈底添加或移除。
2. 栈的基本功能:
StackInit(Stack*tmp): 栈的初始化
StackPush(Stack*tmp,StackDataType x): 入栈
StackPop(Stack*tmp): 出栈
StackEmpty(Stack*tmp): 判空
StackDestroy(Stack*tmp): 栈的销毁
3.栈的实现:
使用链表和顺序表都能实现栈,考虑到栈后进先出的特性,使用顺序表更方便实现栈的功能
3.1 存储结构:(顺序表)
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top; // 栈顶int _capacity; // 容量
}Stack;
3.2 初始化:(void StackInit(stack*tmp))
初始化栈,将栈顶和容量都设置为0
// 初始化栈
void StackInit(Stack* ps) {assert(ps);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}
3.3 栈的销毁:(void StackDestroy(stack*tmp))
释放栈占用的内存,并将栈的指针、容量和栈顶都重置为0
// 销毁栈
void StackDestroy(Stack* ps) {assert(ps);free(ps->_a);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}
3.4 入栈:(void StackPush(stack*tmp,StackDataType x))
当栈满时,将容量加倍(当栈不为空时)或初始化为4(当栈为空时)
//入栈
void StackPush(Stack* ps, STDataType data) {assert(ps);if (ps->_capacity == ps->_top) {int newcapacity = StackEmpty(ps) ? 4 : 2 * ps->_capacity;STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (tmp == NULL) {perror("StackPush:realloc");return;}ps->_a = tmp;ps->_capacity = newcapacity;}ps->_a[ps->_top] = data;ps->_top++;
}
3.5 出栈:(void StackPop(stack*tmp))
将栈顶指针下移,并不释放内存
// 出栈
void StackPop(Stack* ps) {assert(ps);ps->_top--;
}
4.实现代码:
实现一个支持动态增长的栈,其使用动态内存分配(通过malloc
和realloc
)来根据需要扩展栈的容量。当栈满时,它会将容量加倍(当栈不为空时)或初始化为4(当栈为空时)。此外,代码还包含了栈的初始化、入栈、出栈、获取栈顶元素、获取栈的大小、检测栈是否为空以及销毁栈等操作。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top; // 栈顶int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps) {assert(ps);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}
// 入栈
int StackEmpty(Stack* ps);
void StackPush(Stack* ps, STDataType data) {assert(ps);if (ps->_capacity == ps->_top) {int newcapacity = StackEmpty(ps) ? 4 : 2 * ps->_capacity;STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (tmp == NULL) {perror("StackPush:realloc");return;}ps->_a = tmp;ps->_capacity = newcapacity;}ps->_a[ps->_top] = data;ps->_top++;
}
// 出栈
void StackPop(Stack* ps) {assert(ps);ps->_top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps) {return ps->_a[ps->_top - 1];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps) {return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps) {assert(ps);if (ps->_top == 0) {return 1;}return 0;
}
// 销毁栈
void StackDestroy(Stack* ps) {assert(ps);free(ps->_a);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}