链栈
(有图有代码!!!!!)no pic/code you say j8!!!
基本知识点
链栈:栈的链式存储结构,简称链栈(栈的顺序存储结构简称顺序栈)
空栈:对于链栈来说,空栈其实就是top = NULL的时候
对比顺序栈与链栈:
- 两者时间复杂度一样,均为O(1);
- 对于空间性能,顺序栈需要事先确定一个固定长度,可能会存在空间浪费问题,但它的优势是存取时定位方便,而链栈则要求每个元素都有指针域,这同时也增加了一些内存开销,但对于栈的长度无限制;
- 如果栈的使用过程中元素变化不可预料,最好使用链栈,反之,如果他的变化在可控范围内,建议使用顺序栈
基操
- 栈的链式存储结构
typedef struct Node{
int data;
struct Node* next;
}Link_Stack;
Link_Stack *top;
注:链栈的操作大部分和单链表类似,只是在插入和删除上稍微特殊点
- 栈的初始化
Link_Stack* Init()
{
return NULL; //构造一个空栈,链栈区别于单链表,链栈没有头结点
}
- 入栈操作
Link_Stack* push(Link_Stack *top,int x)
{
Link_Stack* p = (Link_Stack*)malloc(sizeof(Link_Stack));
p->data = x; //存数据
//类似单链表,修改指针的指向
p->next = top; //将当前栈顶指针的值赋给新节点
top = p; //将新节点s赋值给栈顶指针
return top;
}
- 出栈操作
Link_Stack* pop(Link_Stack *top)
{
Link_Stack *p = top; //将栈顶指针赋值给p,便于接下来的free()操作
if(!top)
{
printf("空栈,出栈无效\n");
return NULL;
}
top = top->next; //将top指针下移一位,即将当前的top->next赋值给top
free(p);
}
- 获取栈顶元素
int getTopElement(Link_Stack *top)
{
//可加入判断栈是否为空,此处略
return top->data;
}
- 判空
int isEmpty(Link_Stack* top)
{
return (top?0:1); //若为空则返回1,反之为0
}
- 遍历输出
void PrintAll(Link_Stack* top)
{
Link_Stack* p = top;
if(!top) {
printf("空栈!!!没东西看个鸡儿\n");
}
else
{
while(p)
{
printf("%d",p->data);
p = p->next; //栈底指针域为NULL
}
}
}
no pic/code you say j8,本期链栈总结结束,这么肝的博主,点个关注,嗯?