数据结构C语言篇《三》栈和队列概念,模拟函数实现,以及相关OJ面试题

1. 栈

镇楼

栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。可以类比相当于吃饭,吃进去吐出来就是栈(忍着胃部强烈不适码了这句)

1.1栈的概念

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的特性后进先出

注意:栈不能进行遍历操作

1.2栈的实现方法

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的
代价比较小。
在这里插入图片描述
在这里插入图片描述

1.3栈的模拟实现----动态内存

Stack.h

#pragma once

typedef int DataType;

typedef struct Stcak
{
   
	DataType *arr;
	int capacity;	//容量大小
	int size;	//有效元素个数---栈顶
}Stack; 

//栈的初始化
void StackInit(Stack *ps);

//入栈
void StackPush(Stack *ps, DataType data);

//出栈
void StackPop(Stack *ps);

//获取栈顶元素
DataType StackTop(Stack *ps);

//获取栈的大小
int StackSize(Stack *ps);

//判断栈内是否有元素
int StackEmpty(Stack *ps);

//销毁栈
void StackDestroy(Stack *ps);

void TestStack();

Stack.c

#include"Stack.h"
#include<stdio.h>
#include<assert.h>
#include<malloc.h>

//栈的初始化
void StackInit(Stack *ps)
{
   
	assert(ps);
	ps->arr = (DataType *)malloc(sizeof(DataType)* 3);
	if (NULL == ps->arr)	//检测空间是否申请成功
	{
   
		assert(0);
		return;
	}
	ps->capacity = 3;;
	ps->size = 0;
}

//检查容量
void CheckCapacity(Stack *ps)
{
   
	if (ps->size == ps->capacity)
	{
   
		ps->arr = (DataType*)realloc(ps->arr, sizeof(DataType)*ps->capacity * 2);
		if (NULL == ps->arr)	//检测空间是否申请成功
		{
   
			assert(0);
			return;
		}
		ps->capacity *= 2;
	}
}


//入栈
void StackPush(Stack *ps, DataType data)
{
   
	assert(ps);
	CheckCapacity(ps);	//扩容
	ps->arr[ps->size++] = data;
	
}

//出栈
void StackPop(Stack *ps)
{
   
	assert(ps);
	if (StackEmpty(ps))	//检测栈此时是否为空
		return;
	ps->size--;
}

//获取栈顶元素
DataType StackTop(Stack *ps)
{
   
	assert(ps && !StackEmpty(ps));
	//此处不能使用if条件判断,因为if条件判断的为合法情况
	//若是栈为空此时栈没有元素,要获取栈顶元素 则为非法情况
	//可以用assert进行判断
	//if (StackEmpty(ps))
	//	return;
	return ps->arr[ps->size - 1];
}

//获取栈的大小
int StackSize(Stack *ps)
{
   
	assert(ps);
	return ps->size;
}

//判断栈内是否有元素
int StackEmpty(Stack *ps)
{
   
	assert(ps);
	return 0 == ps->size;
}

//销毁栈
void StackDestroy(Stack *ps)
{
   
	assert(ps);
	if (ps->arr)
	{
   
		free(ps->arr);
		ps->arr = NULL;
		ps->capacity = 0;
		ps->size = 0;
	}
}

void TestStack()
{
   
	Stack con;
	StackInit(&con);

	StackPush(&con, 1);
	StackPush(&con, 2);
	StackPush(&con, 3);
	StackPush(&con, 4);
	StackPush(&con, 5);
	StackPush(&con, 6);
	printf("size = %d\n", StackSize(&con));
	printf("top = %d\n", StackTop(&con));

	StackPop(&con);
	StackPop(&con);
	StackPop(&con);
	printf("size = %d\n", StackSize(&con));
	printf("top = %d\n", StackTop(&con));

	StackDestroy(&con);
}

test.c

#define _CRT_SECURE_NO_WARNINGS

#include"Stack.h"

int main()
{
   
	TestStack();
	return 0;
}

1.4关于栈的OJ题

1.括号匹配问题 OJ

typedef char DataType;

typedef struct Stcak
{
   
	DataType *arr;
	int capacity;	//容量大小
	int size;	//有效元素个数---栈顶
}Stack; 


//栈的初始化
void StackInit(Stack *ps)
{
   
	assert(ps);
	ps->arr = (DataType *)malloc(sizeof(DataType)* 3);
	if (NULL == ps->arr)	//检测空间是否申请成功
	{
   
		assert(0);
		return;
	}
	ps->capacity = 3;;
	ps->size = 0;
}

//检查容量
void CheckCapacity(Stack *ps)
{
   
	if (ps->size == ps->capacity)
	{
   
		ps->arr = (DataType*)realloc(ps->arr, sizeof(DataType)*ps->capacity * 2);
		
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿是小贺

谢谢老板的厚爱,感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值