数据结构--栈(概念&实现)

Posted 水澹澹兮生烟.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--栈(概念&实现)相关的知识,希望对你有一定的参考价值。

1.概念–栈

他是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称之为栈顶,另一端称之为栈底,栈中的元素遵循后进先出LIFO(Laat In First Out)的原则。
在这里要注意的一点:栈不可以进行遍历。

2.结构–栈

压栈:站的插入操作较进栈/压栈
出栈:栈的删除操作叫出栈
入的数据在栈顶,出的数据也在栈顶。
在这里插入图片描述

3.栈的特性

后进先出

4.概念区分

几个概念的区分区别
堆/栈指的是一块特殊的内存空间,该内存空间中保存的都是与函数调用相关的一些信息,该空间设计的时候与数据结构中栈的特性一直
栈帧函数在调用时都需要在栈内存中分配各自运行时候要用到的空间 ,给每个函数分配的空间我们将之称为–栈帧,它实际就是一种结构,该结构中保存的时函数调用相关的一些信息:参数,局部变量,一些寄存器信息,返回时需要用到的信息
栈和队列特指的时一种数据结构,特性时后进先出

5.栈的使用:递归转循环时可用栈

举个栗子:将一个链表将其逆置打印。
1.递归

void printListRvs(node* head){
	if (head){
		printListRvs(head->next);
		printf("%d-->", head->data);
	}

有些递归的问题本身就是迭代的问题。我们发现,递归调用的特点和栈的特点相似。在这里我们可以将其用栈来实现,先将链表的每一个结点的值进行压栈,等遍历结点结束,然后在将栈内的数据一个个出栈。
2.循环

void printlsitr(node* head){
	node* cur = head;
	stack s;
	stackInit(&s);
	while (cur){//将链表里的结点的值保存在栈里
		stackpush(&s, cur);
		cur = cur->next;
	}
	while (stackempty(&s)){
		cur = stacktopdata(&s);//得到栈顶的值
		print(cur->data);
		stackpop(&s);//出栈
	}
	destortstack(&s);
	
}

6.栈的实现

1.stack.h 头文件

#pragma once

typedef int DType;
//定义栈的结构
typedef struct stack{
	DType* array;
	int capacity;//栈的大小
	int size;//栈中有多少个元素;可以用来表示栈顶
}stack;



//栈的初始化
void stackInit(stack* p);
//入栈
void stackpush(stack* p, DType data);
//出栈
void stackPop(stack* p);
//获取栈的元素个数
int stacksize(stack* p);
//判空
int stackempty(stack* p);
//获取栈顶元素
DType stacktopdata(stack* p);
//销毁
void stackDestroy(stack* p);
//扩容
void checkCapcity(stack* p);
//测试
void stacktest(stack* p);

2.各个函数的实现
a.栈的初始化

void stackInit(stack* p)
{
	assert(p);
	p->array = (DType*)malloc(sizeof(DType)* 3);//初始时,给3个空间,这样用户可以少传参数
	//检测是否申请成功
	if (NULL == p->array){
		assert(0);
		return;
	}


	p->capacity = 3;
	p->size = 0;
}

b.入栈

void stackpush(stack* p, DType data)
{
	assert(p);
	//要检测是否需要扩容
	checkCapcity(p);

	p->array[p->size] = data;
	p->size += 1;
}

c.出栈

void stackPop(stack* p)
{
	assert(p);
	//判断栈是否为空
	if (stackempty(p)) return;
	p->size--;
}

d.获取栈的元素个数

int stacksize(stack* p){
	assert(p);
	return p->size;
}

e.判空

int stackempty(stack* p){
	assert(p);
	return 0 == p->size;
}

f.获取栈顶元素

DType stacktopdata(stack* p){
	assert(p&&!(stackempty(p)));
	//在这里不可以用if,因为栈是空时,要获取top元素,是非法操作
	return p->array[p->size-1];
}

g.销毁

void stackDestroy(stack* p){
	assert(p);
	if (p->array!=NULL) {
		free(p->array);
		p->array = NULL;
		p->capacity = 0;
		p->size = 0;
	}
}

h.扩容

void checkCapcity(stack* p){
	if (p->size == p->capacity)//表明此时没有空间
	{
		p->array = (DType*)realloc(p->array, sizeof(DType)*p->capacity*2);
		//扩容完成后,检查是否成功
		if (NULL == p->array){
			assert(0);
			return ;
		}
		p->capacity *= 2;
	}
	
}

以上是关于数据结构--栈(概念&实现)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构&算法-共享栈

数据结构&算法-共享栈

数据结构之栈和队列

数据结构 Java数据结构 栈和队列 以及LeetCode相关面试题

数据结构_第六关:栈和队列(栈)

数据结构-栈