栈的实现(顺序表和链表形式)

栈的实现
要实现栈首先我们需要了解什么是栈,即就是栈的定义。
这里写图片描述
栈和队列是很想像的,但是他们有一个根本的区别,栈是后进先出,而队列是先进先出,因此要好好区分这一点。

实现栈需要实现栈的以下几个动作:

  1. 创建栈
  2. 入栈
  3. 出栈
  4. 取栈顶元素
  5. 销毁栈

因此它相对于实现顺序表和链表来说是比较简单的,因为实现顺序表、链表往往动作是非常多的。栈的入栈和出栈实现时就是使用头插和头删或者是尾插和尾删,这两个组合是相对应的。但是当用链表来实现入栈的时候,为了使其更好看些,一般使用的是头插和头删。

下面我们分别用顺序表和链表来实现下栈:

顺序表实现:

//SqStack.h
#pragma once                                                                                                                                                                                   
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

typedef char SqStackType;

typedef struct SqStack{
    SqStackType* data;
    size_t size;
    size_t capacity; //MAXSIZE的替代品,data这段内存中能容纳的元素个数
}SqStack;

void InitSqStack(SqStack *sq);//初始化栈

void SqStackPush(SqStack *sq, SqStackType value);//进栈

void SqStackPop(SqStack *sq);//出栈
//返回两个信息:执行成功失败;栈顶元素的值是多少
int SqStackTop(SqStack *sq, SqStackType* value);//取栈顶元素

void SqStackDestroy(SqStack *sq);//销毁栈

//SqStack.c

#include "SqStack.h"                                                                                                                                                                           
//初始化
void InitSqStack(SqStack *sq){
    if(sq == NULL){
        return;//非法输入
    }
    sq -> size = 0;
    sq -> capacity = 1000;
    sq -> data = (SqStackType*)malloc(sq -> capacity *sizeof(SqStackType));
}

//栈的扩容策略
void SqStackReSize(SqStack *sq){
    if(sq == NULL){
        return;
    }
    if(sq -> size < sq -> capacity){
        return;
    }
    sq -> capacity = sq -> capacity * 2 + 1;//capacity*2(是C++里面的一个方法) + 1(为了方式capacity为0)
    SqStackType* new_ptr = (SqStackType*) malloc(sq -> capacity *sizeof(SqStackType));
    size_t i = 0;
    for(; i < sq -> size; ++i){
        new_ptr[i] = sq -> data[i];
    }
    free(sq -> data);
    sq -> data = new_ptr;
}
//入栈
void SqStackPush(SqStack *sq, SqStackType value){
    if(sq == NULL){
        return;//非法输入
    }
    if(sq -> size
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值