坚持代码实现数据结构DAY03——堆栈
程序员文章站
2023-12-22 23:27:34
...
前言:虽然c++里面有现成的stack可以用,但是我觉得学习数据结构,用底层语言来实现是很有必要的!
**
简单的解释一下;
堆栈就是一种具有特定规则的线性表
先进后出(看图就很直观了)
举个栗子
往一个纸箱里面塞书
先进去的就到了纸箱底部
后进去的在顶上
要想取出后面的书则要先取出顶上的书
链式表
创建结点
typedef struct SNode* PtrToSNode;
struct SNode {
ElementType Data;
PtrToSNode Next;
};
创建栈头(也就是最顶部)
注意是顶部!!!不是底部;
至于为什么
当然是为了插入和删除的方便啊
栈头是不存值的 请类比一下头指针
typedef PtrToSNode Stack;
Stack CreateStack()
{ /* 构建一个堆栈的头结点,返回该结点指针 */
Stack S;
S = (Stack)malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}
判断是否为空
即判断栈顶的下一个有没有对象
bool IsEmpty(Stack S)
{ /* 判断堆栈S是否为空,若是返回true;否则返回false */
return (S->Next == NULL);
}
入栈
先申请一部分空间
将X赋值给新空间的data部分
然后让栈头指向它。
bool Push(Stack S, ElementType X)
{ /* 将元素X压入堆栈S */
PtrToSNode TmpCell;
TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));
TmpCell->Data = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
return true;
}
出栈
和入栈差不多啦
先判断堆栈是不是空的,是空的肯定就不能出栈了啊。
然后声明定义一个指针,让它指向栈头指向的结点(为了释放内存)
同时声明定义一个元素,将出栈的值赋值给它(为了return 出去)
然后直接让栈头指向下一个结点就好了;
然后把内存释放掉。
ElementType Pop(Stack S)
{ /* 删除并返回堆栈S的栈顶元素 */
PtrToSNode FirstCell;
ElementType TopElem;
if (IsEmpty(S)) {
printf("堆栈空");
return ERROR;
}
else {
FirstCell = S->Next;
TopElem = FirstCell->Data;
S->Next = FirstCell->Next;
free(FirstCell);
return TopElem;
}
}
顺序表
个人观点:顺序结构存储编码容易,但是不能动态申请内存,你需要先知道这个栈有多大,要开多大的数组。
创建
typedef int Position;
struct SNode {
ElementType* Data; /* 存储元素的数组 */
Position Top; /* 栈顶指针 */
int MaxSize; /* 堆栈最大容量 */
};
栈头
typedef struct SNode* Stack;
Stack CreateStack(int MaxSize)
{
Stack S = (Stack)malloc(sizeof(struct SNode));
S->Data = (ElementType*)malloc(MaxSize * sizeof(ElementType));
S->Top = -1;
S->MaxSize = MaxSize;
return S;
}
堆栈是否已满
满了就塞不进了啊
bool IsFull(Stack S)
{
return (S->Top == S->MaxSize - 1);
}
入栈
bool Push(Stack S, ElementType X)
{
if (IsFull(S)) {
printf("堆栈满");
return false;
}
else {
S->Data[++(S->Top)] = X;
return true;
}
}
是否为空
bool IsEmpty(Stack S)
{
return (S->Top == -1);
}
出栈
ElementType Pop(Stack S)
{
if (IsEmpty(S)) {
printf("堆栈空");
return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
}
else
return (S->Data[(S->Top)--]);
}