栈(stack)——基本定义、性质与代码实现(C/C++)
1. 栈(stack)是什么?
栈的定义:
只允许在一端进行插入或删除操作的线性表。
2. 栈(stack)的性质
从定义可知,栈是一种操作受限的线性表,允许插入或删除操作的一端称为栈顶(Top),另一端称为栈底(Bottom),栈顶的当前位置是动态的——随元素的插入或删除而改变,因此栈有一个称为栈顶指针的位置指示器来指示栈顶当前位置。
当栈中没有数据元素时称为栈空;
栈的插入操作称为入栈(Push)或进栈;
栈的删除操作称为出栈(Pop)或退栈;
栈的主要特点是后进先出,这个特性使得递归与栈密切相关。
栈就好比一个死胡同,假设有若干个人走进,那么最后走进的人最先走出。
理解总结:
栈是一种数据结构,即栈有其逻辑结构、存储结构和对应的基本运算。从定义可知,栈是一种线性表,即栈在逻辑上属于线性结构,数据元素之间存在一对一对的关系,这意味着在存储结构上,数据元素间的逻辑关系可以像一般的线性表那样用存储单元间的地址关系隐含表示,因此可用顺序表实现;或者用指针域存储——使用链表实现。
4. 代码实现
1. 顺序栈
数据组织方法:
声明包含一个存储数据的顺序表和栈顶指针的结构体,作为栈的数据类型。声明一个栈指针,并指向创建的栈。
1)顺序栈的类型声明:
typedef struct
{
ElemType data[MaxSize];
int top;
}SqStack;
2)创建并初始化栈:
void InitStack(SqStack * &stack_p)
{
stack_p = (SqStack *)malloc(sizeof(SqStack));
stack_p->top = -1;
}
3)入栈操作(Push):
bool Push(SqStack * &stack_p, ElemType elem)
{
if (stack_p->top == MaxSize-1)
return false;
else
{
stack_p->top++;
stack_p->data[stack_p->top] = elem;
return true;
}
}
4)出栈操作(Pop):
bool Pop(SqStack * &stack_p, ElemType &elem)
{
if (stack_p->top == -1)
return false;
else
{
elem = stack_p->data[stack_p->top];
stack_p->top--;
return true;
}
}
2. 链栈
数据组织方法:
创建栈时,声明一个链栈结点的指针作为首结点,其作用是作为链表的指针,因此数据域不使用,而将其指针域指向链栈的栈顶结点。
1)数据结点类型声明:
typedef struct node
{
ElemType data;
struct node *next;
}LinkStNode;
2)创建并初始化链栈指针:
void InitStack(LinkStNode * &stack_p)
{
stack_p = (LinkStNode *)malloc(sizeof(LinkStNode));
stack_p->next = NULL;
}
3)入栈操作(Push):
void Push(LinkStNode * &stack_p, ElemType elem)
{
LinkStNode *node_p = (LinkStNode *)malloc(sizeof(LinkStNode));
node_p->data = elem;
node_p->next = stack_p->next;
stack_p->next = node_p;
}
4)出栈操作(Pop):
bool Pop(LinkStNode * &stack_p, ElemType *elem)
{
if (stack_p->next == NULL)
return false;
else
{
LinkStNode *delnode_p = stack_p->next;
stack_p->next = delnode_p->next;
elem = delnode_p->data;
free(delnode_p);
return true;
}
}
以上为栈的顺序存储结构和链式存储结构的基本实现代码,更多运算实现源码:GitHub地址
有问题的朋友欢迎私信交流!