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