数据结构-栈(7.14)


写在最前

白天事情太多了,总结的晚了,考研自用

一、栈的基本概念

在这里插入图片描述

  1. :只允许在一端进行插入或删除的线性表。
  2. 栈顶:线性表允许进行插入和删除的那一端。
  3. 栈底:线性表不允许进行插入和删除的另外一端
  4. 空栈:不含任何元素的空表。
  5. 栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为 1 n + 1 C 2 n n { {1} \over {n+1}}C_{2n}^{n} n+11C2nn(卡特兰数)。

栈首先是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。

二、栈的基本操作

  1. InitStack(&S):初始化一个空栈。
  2. StackEmpty(S):判断一个栈是否为空。(栈S为空,返回true;不为空,返回false)
  3. Push(&S,x):入栈,若栈S未满,则新入栈的元素为新栈顶
  4. Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。
  5. GetTop(S,&x):读取栈顶元素,若栈S非空,则用x返回栈顶元素。
  6. DestroyStack(&S):销毁栈,并释放栈S占用的存储空间。

读取栈顶元素只读取元素不进行删除操作,注意区别的销毁栈。

三、栈的顺序存储结构

3.1顺序栈

采用顺序结构的栈成为顺序栈

//顺序栈的定义
#define MaxSize 10
typedef struct
{
    
    
    ElemType data[MaxSize]; //静态数组中存放栈的元素
    int top;                //栈顶指针
} SqStack;

//初始化
void InitStack(SqStack &S)
{
    
    
    S.top=-1;
}

//判栈空
bool StackEmpty(SqStack S)
{
    
    
    if(S.top==-1)
        return ture;
    else 
        return false;
}

//进栈
bool Push(SqStack &S,ElemType x)
{
    
    
    if(S.top==MaxSize-1)
        return false;
    S.data[++top]==x;
    return true;
}

//出栈
bool Pop(SqStack &S,ElemType &x)
{
    
    
    if(S.top==-1)
        return false;
    else
        x=S.data[top--];
    return true;
}

//读取栈顶元素
bool GetTop(SqStack S,EleType &x)
{
    
    
    if(S.top==-1)
        return false;
    else
        x=S.data[top];
    return true;
}

注 意 : \color{red}注意:

  • 初始化栈顶指针S.top=-1,栈顶元素:S.data[S.top]
  • 栈空条件:S.top==-1,栈满条件:S.top==MaxSize-1,栈长:S.top+1
  • 缺点:栈的大小不可变

3.2共享栈

针对栈的栈底位置相对不变,可以让两个顺序栈共享一个一维数组空间,这样的栈称为共享栈。
在这里插入图片描述

  • top0=-1时0号栈为空,top1=MaxSize时栈为空
  • top1-top0=1时栈满
  • 0号栈进栈t++op0后赋值,1号栈进栈- -op1后赋值,出栈与之相反

四、栈的链式存储结构

采用链式存储的栈称为链栈。

//链栈
typedef struct LinkNode
{
    
    
    ElemType data;
    struct LinkNode *next;
} LiStack;

链栈的操作和链表相似,出栈入栈的操作都在链表的表头进行。

五、易错试题

待补充

写在最后

付出,就有收获!

おすすめ

転載: blog.csdn.net/liangsena/article/details/118740150