特点:
- 先入先出
- 出入口只有一个(弹夹)
1. 顺序栈
1.1 定义
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 64
typedef int datatype;
typedef struct
{
datatype data[MaxSize];
int top;
}seqstack;
1.2 初始化
seqstack* InitStack(seqstack* s)
{
s=(seqstack*)malloc(sizeof(seqstack));
s->top=-1;
return s;
}
1.3 入栈
int Push(seqstack *sstack,datatype x)//入栈;
{
if(sstack->top==MaxSize-1)
{
printf("stack full!\n");
return -1;
}
sstack->top++;
sstack->data[sstack->top]=x;
return 1;
}
1.4 出栈
int Pop(seqstack *sstack)//出栈;
{
if(sstack->top==-1)
{
printf("OVER->Top = %d",sstack->top);
return -1;
}
printf("Pop %d\n",sstack->data[sstack->top]);
sstack->top--;
return 1;
}
2. 链栈(重点)
2.1 定义
typedef struct node
{
datatype data;
struct node * next;
}LinkStack;
LinkStack *top;
2.2 入栈
LinkStack* Push(LinkStack* top,datatype x)
{
LinkStack* p;
p = (LinkStack)malloc(sizeof(LinkStack));
p->data = x;
p->next = top->next;
top=p;
return top;
}
2.3 出栈
LinkStack* Pop(LinkStack* top)
{
LinkStack* q;
if(!top){
printf("Stack null!");
return NULL;
}
q=top->next;
top=top->next;
free(q);
return top;
}
记忆总结
- 链栈数据是通过数组存放,但外层依旧是一个结构体(跟顺序表一样)
- 栈满:top==MaxSize-1 为什么要减一?因为栈空时top=-1而非1,相当于错开了一位。为什么top不从1开始?方便利用top作为数组下标去索引数据
- 入栈只需要将top++且top指向的位置赋为新值即可
- 出栈只需要top- -
- 链栈就是只通过一个top指针连接、只进行头插法、头删除的单链表。