栈的顺序存储结构实现
栈的数据元素之间的一一对应的关系可以利用顺序的存储来表示, 那么可以利用数组来实现栈数据结构.存储结构伪代码
struct stack_record;
typedef struct stack_record * stack;
stack init_stack(int max_elements); // 初始化操作, 建立空栈
void dispose_stack(stack s); // 销毁栈
void clear_stack(stack s); // 清空栈
int is_empty(stack s); // 判断栈是否为空
int is_full(stack s); // 判断栈是否已满
element_type get_top(stack s); // 获取栈顶元素
void push(element_type element, stack s); // 入栈
void pop(stack s); // 出栈
struct stack_record {
int capacity; // 栈的最大容量
int top_of_stack; // 栈顶的下标
element_type *array; // 存储元素的数组
};
- 实现
init_stack
函数
思路:
step1: 创建栈记录s
step2: 为栈记录中存储数据的数组分配内存
step3: 设置栈的最大容量
step4: 初始化栈顶位置
stack init_stack(int max_elements)
{
stack s = malloc(sizeof(struct stack_record));
if(s == NULL)
error("Out of space.");
s->array = malloc(sizeof(element_type) * max_elements);
if(s->array == NULL)
error("Out of space.");
s->capacity = max_elements;
s->top_of_stack = start;
return s;
}
- 实现
dispose_stack
函数
思路: 先释放栈记录中存储数据的数组的内存, 再释放栈记录的内存
void dispose_stack(stack s)
{
if(s != NULL) {
free(s->array);
free(s);
}
}
- 实现
clear_stack
函数
思路: 将栈记录中栈顶位置设置为起始位置
void clear_stack(stack s)
{
s->top_of_stack = start; // start等于-1
}
- 实现
is_empty
函数
思路: 比较栈顶是否在起始位置
bool is_empty(stack s)
{
return s->top_of_stack == start; // start等于-1
}
- 实现
is_full
函数
思路: 比较栈顶是否达到栈的最大容量位置
bool is_full(stack s)
{
return s->top_of_stack == s->capacity;
}
- 实现
get_top
函数
思路: 先从栈记录中获取栈顶下标, 在用下标从数组中获取数组元素
element_type get_top(stack s)
{
if(!is_empty(s)) {
return s->array[s->top_of_stack];
}
else {
error("Empty satck!");
return 0;
}
}
- 实现
push
函数
思路: 将element的值赋给数组的top_of_stack +1的位置, 并将top_of_stack的值加1
void push(element_type element, stack s)
{
if(is_full(s)) {
error("Full stack!\n"};
}
else {
s->array[++(s->top_of_stack)] = element;
}
}
- 实现
pop
函数
思路: 将top_of_stack的值减1
void pop(stack s)
{
if(id_empty(s)) {
error("Empty stack!\n");
}
else {
s->top_of_stack--;
}
}