概念
栈作为一种限定性线性表,是将线性表的插入和删除运算限制为仅在表的一端进行。通常将表中允许进行插入、删除操作的一端称为栈顶 (Top),表的另一端被称为栈底 (Bottom)。当栈中没有元素时称为空栈。栈的插入操作被形象地称为进栈或入栈,删除操作称为出栈或退栈。
给上相关操作的动画链接:
https://pan.baidu.com/s/1LwAqu3BgixWvwQDXIik3JA
提取码:9tco
复制这段内容后打开百度网盘手机App,操作更方便哦
实现
顺序
定义
# define max_size 50
typedef int ElemType;
typedef struct{
ElemType elme[max_size];
int top;
}SeqStack;
操作
初始化
SeqStack* Init()
{
SeqStack* s = malloc(sizeof(SeqStack));
s->top = -1;
return s;
}
入栈
void Push(SeqStack* s,ElemType e)
{
if(s->top >= max_size-1)
{
printf("此栈已满");
return;
}
s->elme[++s->top] = e;
}
岀栈
void Pop(SeqStack* s, ElemType* e)
{
if(s->top <= -1)
{
printf("此栈已空");
return;
}
*e = s->elme[s->top--];
}
调用展示
链式
定义
#define max_size 50
typedef int ElemType;
typedef struct LinkStack{
ElemType data;
struct LinkStack* next;
}LinkStack,* Node;
操作
初始化
LinkStack* Init()
{
LinkStack* s = malloc(sizeof(LinkStack));
s->next = NULL;
return s;
}
入栈
void Push(LinkStack* s,ElemType e)
{
Node node = malloc(sizeof(LinkStack));
node->data = e;
node->next = s->next;
s->next = node;
}
岀栈
void Pop(LinkStack* s, ElemType* e)
{
Node node = s->next;
if(s->next == NULL)
{
printf("姝ゆ爤宸茬┖");
return;
}
*e = node->data;
s->next = node->next;
free(node);
}
调用展示
双端栈
定义
#define max_size 50
typedef int ElemType;
typedef struct{
ElemType elme[max_size];
int top[2];
}DqStack;
操作
初始化
DqStack* Init()
{
DqStack* s = malloc(sizeof(DqStack));
s->top[0] = -1;
s->top[1] = max_size;
return s;
}
入栈
void Push(DqStack* s,ElemType e, int direction)
{
if(s->top[0] >= s->top[1] - 1)
{
printf("此栈已满");
return;
}
if(direction == 0)
{
s->elme[++s->top[0]] = e;
}
else
{
s->elme[--s->top[1]] = e;
}
}
岀栈
void Pop(DqStack* s, ElemType* e,int direction)
{
if(direction == 0)
{
if(s->top[0] <= -1)
{
printf("此栈已空");
return;
}
*e = s->elme[s->top[0]--];
}
else
{
if(s->top[1] >= max_size)
{
printf("此栈已空");
return;
}
*e = s->elme[s->top[1]++];
}
}