栈的基本操作(顺序栈)

栈的类型声明以及函数声明:stack.h

#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>

// 定义栈的元素类型  以整型为例
typedef int DataType;

// 定义栈的结构体  此处为顺序栈(内存为连续的)
typedef struct {
    DataType *stack;
    int top; // 栈顶指针,初始值为-1,表示栈为空  
    int maxSize; //最大容量
} Stack;

//创建栈
Stack* initStack(int maxSize);

// 判断栈是否为空  
bool isStackEmpty(const Stack* stack);

// 判断栈是否已满  
bool isStackFull(const Stack* stack);

// 入栈操作  
void push(Stack* stack, DataType element);

// 出栈操作  
void pop(Stack* stack);

// 获取栈顶元素  
DataType peek(const Stack* stack);

// 销毁栈  
void destroyStack(Stack* stack);

//获取栈的元素个数
int stackSize(const Stack* stack);

相关函数实现:stack.c

#include"stack.h"

//创建栈
Stack* initStack(int maxSize)
{
	Stack* pstack = (Stack*)malloc(sizeof(Stack));
	assert(pstack);
	//申请数据内存
	pstack->stack = (DataType*)malloc(maxSize * sizeof(DataType));
	//初始化最大值
	pstack->maxSize = maxSize;
	//初始化栈顶序号
	pstack->top = -1;  //-1代表空栈
}

//获取栈中元素个数
int stackSize(const Stack* pstack)
{
	//元素个数等于数组下标+1
	return pstack->top + 1;
}

// 判断栈是否为空  
bool isStackEmpty(Stack* pstack) 
{
	if (pstack->top == -1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

// 判断栈是否已满  
bool isStackFull(Stack* pstack)
{
	if (pstack->top+1== pstack->maxSize)
	{
		return true;
	}
	else
	{
		return false;
	}
}

// 入栈操作:直接将元素放到栈顶位置即可
void push(Stack* pstack, DataType element)
{
	//判断栈是否还存在
	assert(pstack);
	//判断栈是否满了
	if (isStackFull(pstack))
	{
		printf("栈满\n");
		return;
	}
	else
	{
		//先做++,再将元素进行放入
		pstack->top++;
		pstack->stack[pstack->top] = element;
	}
}

// 出栈操作:数组的伪删除(不是真的删除数据,通过下标赋予修改权限)
void pop(Stack* pstack)
{
	//判断栈是否还存在
	assert(pstack);
	if (isStackEmpty(pstack))
	{
		printf("空栈\n");
		return;
	}
	else
	{
		pstack->top--;
	}
}

// 获取栈顶元素  
DataType peek(Stack* pstack)
{
	//如果栈为空或者栈不存在,则报错
	assert(pstack);
	assert(!isStackEmpty(pstack));
	return pstack->stack[pstack->top];
}

// 销毁栈  
void destroyStack(Stack* pstack)
{
	//注意先后顺序
	free(pstack->stack);
	free(pstack);
	//在表外进行置空操作
	//pstack=NULL;
}

栈是一个特殊的线性表,顺序栈和顺序表的写法大同小异,这里采用动态申请内存的方式创建栈,也可以用#define MAXSIZE和创建数组来实现栈的创建,两者没有本质区别,在内存中都是连续的。如有错误,请在评论区指正,谢谢!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值