数据结构中栈的学习基础知识总结
栈的描述
栈是一种特殊的的线性表,只在一端(栈顶,top)进行插入和删除
- 输入数据:入栈 push
- 删除数据并返回栈顶元素:出栈 pop
栈的操作集
- 栈(stack)的长度 Maxsize
- 栈的元素 item
- 生成空栈
Stack CreateStack(int Maxsize)//生成空栈,最大长度为Maxsize
- 判断栈是否满
int IsFull(Stack S,int Maxsize)
- Push操作
void Push(Stack S ,ElementType item)
- Pop操作
ElementType Pop(Stack S)
- 判断栈是否为空
int IsEmpty(Stack S)
栈的操作
栈的顺序存储结构
- 由一个存储的一维数组和记录栈顶元素的变量组成
#define MaxSize//存储数据元素的最大个数
typedef struct SNode *Stack;//在这之后Stack代表了struct SNode *
struct SNode{
ElementType Data[MaxSize];
int top;
};
- 在初始化时一般
struct SNode S;
S.top=-1;//以便一开始时栈顶记录变量指向正确,在添加一个元素后top++
//如在空栈中添加了一个item,Data[top]就开始表示了栈顶元素
//减少一个元素后top--,对于顺序存储结构的栈而言,top=-1是判断空栈的标志
- Push操作
void Push(Stack S,ElementType item)
{
if(S->top==MaxSize-1)
{
printf("栈堆满!");
return ;
}//判断栈是否满了
else{S->Data[++(S->top)]=item;
return;}
}
- Pop操作
ElementType Pop(Stack S)
{
if(S->top==-1){
printf("此栈为空");
return ;
}
else{
return S->Data[(S->top)--];
}
}
栈的链式存储的实现
这类似于线性单链表的构建
- 构造链栈的结构
typedef struct SNode{
ElementType Data;
SNode *next;
}SNode,*Stack;
Stack CreateStack()
{
Stack S;//头指针
S=(Stack)mallco(sizeof(Stack));
S->next=NULL;
return S;
}//创造一个空的栈链表
int IsEmpty(stack S)
{
return(S->next==NULL);
}//空栈返回1,非空返回0
- 栈链表的Push操作
void Push(ELementType item,Stack S)//这里不用Stack *s的原因是无需改变S本身的指向,S始终作为栈顶元素
{
SNode *TmpCell;
TmpCell=(Stack)malloc(sizeof(Stack));
TmpCell->next=S->next;
TmpCell->Data=item;
S->next=TmpCell;
}//这里没有设置判断内存是否满的操作是合理的,现在计算机内存比较大
- 栈链表的Pop操作
ElementType Pop(Stack S)
{
SNode *FirstCell;
ElementType TopElement;
if(IsEmpty(S)){
printf("此栈为空!");
return NULL;
}
FirstCell=S->next;
TopElement=FirstCell->Data;
S->next=FirstCell->next;
free(FirstCell);
return TopElement;
}
——————————中南大学人工智能系19级学生学习笔记