线性表之堆栈

什么是堆栈

  • 像叠盘子一样,先放下的在下面,先拿出来的却是最上面的,也就是,先进去的最后才出来
  • 先进后出的就是堆栈

堆栈的操作

  • 生成空堆栈,其最大长度为MaxSize
  • 判断堆栈S是否已满
  • 将元素item压入堆栈
  • 判断堆栈S是否为空
  • 删除并返回栈顶元素

堆栈的链式存储实现

链表结构体初始化

typedef struct SNode *Stack;
struct SNode
{
ElementType Data;
struct SNode *Next;
}

堆栈初始化

Stack createStack()
{
//构建一个堆栈的头结点,返回指针
Stack S;
S = (Stack)malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}

判断堆栈S是否为空

int IsEmpty(Stack S)
{
//判断堆栈s是否为空,若为空函数返回整数1,否则返回整数0
return (S->Next == NULL);
}

将元素item压入堆栈

void Push(ElementType item, Stack S)
{
//将元素item压入堆栈S
struct SNode* TmpCell;
//感觉 (struct SNode*) ,这里是不是可以换成 (Stack) ?找个机会试试
TmpCell = (struct SNode *)malloc(sizeof(struct SNode));
TmpCell->Element = item;
TmpCell->Next = S->Next;
//使得 TmpCell 为头结点,并且 S 仍旧指向头结点
//这样做的好处是
//在出栈的时候,直接调用 S 就行了。S 必然是最后保存的元素
S->Next = TmpCell;
}

删除并返回栈顶元素

ElementType Pop(Stack S)
{
//删除并返回堆栈S的栈顶元素
struct SNode* FirstCell;
//定义同栈顶元素类型的一个变量,用于存储栈顶元素
ElementType TopElem;
//判断是否为空栈
if (ISEmpty(S)) 
{
	printf("堆栈为空");
	return NULL;
}
else
{
	//释放空间前的预备操作,将 次结点 作为 头结点
	FirstCell = S->Next;
	S->Next = FirstCell->Next;
	//存储栈顶元素,不然释放空间后就找不到元素了
	TopElem = FirstCell->Element;
	free(FirstCell);
	//返回栈顶元素(其实也就是出栈啦,顺带删除掉而已)
	return TopElem;
}
}
posted @ 2023-01-25 21:11  淦丘比  阅读(17)  评论(0编辑  收藏  举报