用顺序表实现栈(c语言)

概念篇

如果你提前学过顺序表的相关知识和代码,那么学习这篇文章你会轻松很多。感兴趣的朋友可以看下这篇文章线性表——顺序表(c语言)
对链表感兴趣的朋友可以看一下链表实现栈这篇文章。
在这里插入图片描述
栈是一种特殊的线性表,特殊于它先进后出的特征,而这个特征可以通过顺序表(数组)的方式实现。

示意图

在这里插入图片描述

代码篇

1.栈的声明

把一些属性封装起来表示栈。
typedef struct stack
{
	int*elements;//指向栈中元素的指针
	size_t size;//栈中元素的数量
	int capacity;//栈的容量
}stack; 

2.栈的创建

void stack_create(stack*stk)
{
	stk->elements=(int*)malloc(sizeof(int)*8);
	// 为栈分配足够的内存以存储8个整数 
	stk->size=0;
	stk->capacity=8;
	// 容量初始化为8,表示栈最多可以存储8个元素  
}

3.栈的销毁

释放分配的内存空间
void stack_destory(stack*stk)
{
	free(stk->elements);
	//释放分配内存
    stk->elements=NULL;
    //指针为空
    stk->size=0;
    stk->capacity=0;
}

4.栈的扩容

在这里我把容量扩大了原来的两倍
void stack_realize(stack*stk)
{
	int *newelements=(int*)realloc(stk->elements,sizeof(int)*stk->capacity*2);
	//尝试将elements的存储空间扩大到原来的两倍。 
	stk->elements=newelements;
	stk->capacity*=2;
	//更新stack的capacity成员
}

5.入栈

1.判断栈是否满了,满了则扩容。
2.没满则在末尾插入元素。
void stack_push(stack*stk,int value)
{
	if(stk->size==stk->capacity)
		stack_realize(stk);
		//如果栈中的元素个数等于栈的最大容量则扩容
	stk->elements[stk->size++]=value;
	/*末尾插入元素,并且元素个素自增
	也可以写成:
	stk->elements[stk->size]=value;
	stk->size++;
	*/
}

6.出栈

int stack_pop(stack*stk)
{
	if(stk->size==0)
    {
    	//如果当前元素为0,不能出栈
        printf("stack underflow");
        exit(1);
    }
    return stk->elements[--stk->size];
    //返回出栈的元素并且更新元素数量
}

7.返回栈顶元素

如果栈不为空直接返回末尾元素
int stack_top(stack*stk)
{
	if(stk->size==0)
        printf("stack is empty!");
	return stk->elements[stk->size-1];
	//返回末尾元素
}

8.栈的元素个数

直接返回stack的size成员
int stack_size(stack*stk)
{
    return stk->size;
}

9.完整代码

#include<stdio.h>
#include<stdlib.h>
typedef struct stack
{
	int*elements;//指向栈中元素的指针
	size_t size;//栈中元素的数量
	int capacity;//栈的容量
}stack;
void stack_create(stack*stk)
{
	stk->elements=(int*)malloc(sizeof(int)*8);
	//为栈分配足够的内存以存储8个整数 
	stk->size=0;
	stk->capacity=8;
	// 容量初始化为8,表示栈最多可以存储8个元素  
}
void stack_destory(stack*stk)
{
	free(stk->elements);
	//释放分配内存
    stk->elements=NULL;
    //指针为空
    stk->size=0;
    stk->capacity=0;
}
void stack_realize(stack*stk)
{
	int *newelements=(int*)realloc(stk->elements,sizeof(int)*stk->capacity*2);
	//尝试将elements的存储空间扩大到原来的两倍。 
	stk->elements=newelements;
	stk->capacity*=2;
	//更新stack的capacity成员
}
void stack_push(stack*stk,int value)
{
	if(stk->size==stk->capacity)
		stack_realize(stk);
		//如果栈中的元素个数等于栈的最大容量则扩容
	stk->elements[stk->size++]=value;
	/*末尾插入元素,并且元素个素自增
	也可以写成:
	stk->element[size]=value;
	stk->size++;
	*/
}
int stack_pop(stack*stk)
{
	if(stk->size==0)
    {
    	//如果当前元素为0,不能出栈
        printf("stack underflow");
        exit(1);
    }
    return stk->elements[--stk->size];
    //返回出栈的元素并且更新元素数量
}
int stack_top(stack*stk)
{
	if(stk->size==0)
        printf("stack is empty!");
	return stk->elements[stk->size-1];
	//返回末尾元素
}
int stack_size(stack*stk)
{
    return stk->size;
}
int main()
{
    stack stk;
    stack_create(&stk);
    stack_push(&stk,10);
    stack_push(&stk,20);
    stack_push(&stk,30);
    //10 20 30
    printf("stacktop is:%d\n",stack_top(&stk));
    //30
    printf("stackpop is:%d\n",stack_pop(&stk));
    //30
    printf("stacksize is:%d\n",stack_size(&stk));
    //2
    stack_destory(&stk);
    return 0;
}
/*应该打印
30
30
2
*/

运行效果

在这里插入图片描述
在这篇文章中我用了顺序表来写栈,在下一篇文章中我会用链表来写栈
希望这篇文章能让你有所启发,也希望其他朋友能对我的文章进行补充和指正,感激不尽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值