数据结构之栈的顺序存储结构实现

  • 栈的顺序存储结构实现
    栈的数据元素之间的一一对应的关系可以利用顺序的存储来表示, 那么可以利用数组来实现栈数据结构.

  • 存储结构伪代码

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--;
    }
}

你可能感兴趣的:(数据结构与算法)