3.©数据结构-堆栈(顺序&&链式)
堆栈是一种先进后出的线性表,也被称为后入先出表( Last in First out)LIFO
数据对象集: 一个有0个或多个元素的有穷线性表
操作集 生成,压入 弹出 是否空,是否满
(我对代码的理解都在注释)
顺序存储
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElementType;
typedef int Position;
typedef struct SNode * PtrToSNode;
#define MAXSIZE 100
/*习惯将栈顶指针放在数组下标小的那端,当top指向Maxsize-1,沾满*/
struct SNode{
ElementType * Data; /*存储元素的数组*/
Position Top; /*栈顶指针*/
int Maxsize;
};
typedef PtrToSNode SStack;
SStack CreatStack(int MAXSIZE)
{
SStack S = (SStack)malloc(sizeof(struct SNode));
S->Data=(ElementType*)malloc(MAXSIZE*sizeof(ElementType));
S->Top=-1;
S->Maxsize = MAXSIZE;
return S;
}
bool IsFull(SStack S)
{
return(S->Top == S->Maxsize-1);
}
bool Push(SStack S, ElementType X)
{
if(IsFull(S)){
printf("堆栈满");
return false;
}
else{
S->Data[S->Top+1]=X;
S->Top++;
return true;
}
}
bool IsEmpty(SStack S)
{
return(S->Top == -1);
}
ElementType Pop(SStack S)
{
if(IsEmpty(S)){
printf("堆栈空");
return ERROR;
}
else
return(S->Data[S->Top-1]);
S->Top--;
}
链式存储
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElementType;
typedef int Position;
typedef struct SNode * PtrToSNode;
#define MAXSIZE 100
/*连战与单链表类似,top就是链表的头指针,栈底节点的next为null*/
struct SNode{
ElementType Data;
PtrToSNode Next;
};
typedef PtrToSNode SStack;
SStack CreatStack()
{
/*构建一个堆栈的头结点,返回节点指针*/
SStack S;
S=malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}
bool IsEmpty(SStack S)
{ /*若为空,返回true,否则返回false*/
return(S->Next == NULL);
}
/*下面这种方法实际上是对应单链表里的头插法,s->next总指向首节点(注意不是头结点呦)*/
/*我认为其实用尾插法也能做到,但这样就多了一步S=tempcell(即S=S->next)完全没必要嘛,不推荐*/
bool Push(SStack S, ElementType X)
{
SStack TmpCell;
TmpCell = (SStack)malloc(sizeof(struct SNode));
TmpCell->Data = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
return true;
}
ElementType Pop (SStack S)
{
SStack FirstCell;
ElementType TopElem;
if(IsEmpty(S))
{
printf("堆栈空");
return ERROR;
}
else{
FirstCell = S->Next;
TopElem = FirstCell->Data;
S->Next = FirstCell->Next;
free(FirstCell);
return TopElem;
}
}