栈的链式存储实现
链式栈 栈头 + 不带头结点的链表
数据类型
typedef int DataType;
//结点类型
struct node
{
DataType data;
struct node *next;
};
//栈头类型
typedef struct
{
//指向栈顶结点
struct node *top;
//记录栈中元素个数
int n;
}LinkStack;
常用操作
1.创建空栈,s->top == NULL
LinkStack *create_empty_linkstack()
{
1.为栈头在堆区分配空间,用s保存
2.s->top = NULL;
3.s->n = 0;
4.返回s
}
2.判空
int is_empty_linkstack(LinkStack *s)
{}
3.入栈,类似链表的头插法
int push_linkstack(LinkStack *s,DataType data)
{
1.为新结点在堆区分配空间,用temp保存
2.存入数据,
3.通过栈顶指针插入链表中
4.s->n++
}
4.出栈,
DataType pop_linkstack(LinkStack *s)
{
1.用temp 保存原栈顶的结点首地址
2.取原栈顶结点数据
3.更新栈顶指针
4.释入原栈顶空间
5.s->n--;
}
5.获得栈顶元素
DataType get_top_data(LinkStack *s)
{}
//head.h
#ifndef __HEAD__H
#define __HEAD__H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int DataType;
//定义结点类型
struct node
{
DataType data;
struct node *next;
};
//栈头类型
typedef struct
{
//指向栈顶结点
struct node *top;
//记录栈中元素
int n;
}LinkStack;
extern LinkStack *create_empty_stack();
extern int is_empty_stack(LinkStack *s);
extern int push_linkstack(LinkStack *s,DataType data);
extern DataType pop_linkstack(LinkStack *s);
extern DataType get_top_data(LinkStack *s);
#endif
#include "head.h"
//创建空栈
LinkStack *create_empty_stack()
{
LinkStack *s =NULL;
s = (LinkStack*)malloc(sizeof(LinkStack));
s->top = NULL;
s->n = 0;
return s;
}
//栈判空
int is_empty_stack(LinkStack *s)
{
//return s->n;
return s->top == NULL;
}
int push_linkstack(LinkStack *s,DataType data)
{
struct node *temp = NULL;
temp = (struct node*)malloc(sizeof(struct node));
temp->data = data;
temp->next = s->top;//在新结点后链接链式栈
s->top = temp;//更新栈顶指针
s->n++;//跟新栈元素个数
return 0;
}
//出栈
DataType pop_linkstack(LinkStack *s)
{
struct node *temp = NULL;
DataType data;
temp = s->top ;
data = temp->data;
s->top = s->top->next;
s->n--;
free(temp);
return data;
}
DataType get_top_data(LinkStack *s)
{
return s->top->data;
}
#include "head.h"
int main()
{
LinkStack *s = NULL;
int i = 0;
s = create_empty_stack();
for(i = 0;i < 9;i++)
{
push_linkstack(s,i);
}
printf("top:%d\n",get_top_data(s));
return 0;
}