【考研代码笔记】数据结构

105 阅读2分钟

【数据结构学习笔记】3.1栈(Stack)

1.栈的定义

  • 只允许在一端进行插入或删除操作的线性表
  • 特点:后进先出-Last In First Out(LIFO)
  • n个不同元素进栈,出栈元素不同排列的个数为1.png

2.顺序栈的定义和初始化操作

#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 true;
    else                    //不空
        return false; 
} 

3.进栈操作

//新元素入栈
bool Push(SqStack &S,ElemType x){
    if(S.top==MaxSize-1)    //栈满 
        return false;
    S.top=S.top+1;          //指针先加1
    S.data[S.top]=x;        //新元素入栈
    return true; 
}
  • S.top=S.top+1;
    S.data[S.top]=x;
    可以等价为: S.data[++S.top]=x;

4.出栈操作

//出栈操作
bool Pop(SqStack &S,ElemType &x){
    if(S.top==-1)           //栈空
        return false;
    x=S.data[S.top];        //栈顶元素先出栈
    S.top=S.top-1;          //指针再减1
    return true; 
} 
  • x=S.data[S.top];
    S.top=S.top-1;
    可以等价为:x=S.data[S.top--];

5.读取栈顶元素

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

6.栈初始化及操作的另一种方式

//初始化栈
void InitStack(SqStack &S){
    S.top=0;                //初始化栈顶指针 
} 
​
//判断栈空
bool StackEmpty(SqStack S){
    if(S.top==0)            //栈空
        return true;
    else                    //不空
        return false; 
} 
​
//新元素入栈
bool Push(SqStack &S,ElemType x){
    if(S.top==MaxSize-1)    //栈满 
        return false;
    S.data[S.top]=x;        //新元素入栈
    S.top=S.top+1;          //指针先加1
    return true; 
}
​
//出栈操作
bool Pop(SqStack &S,ElemType &x){
    if(S.top==-1)           //栈空
        return false;
    S.top=S.top-1;          //指针再减1
    x=S.data[S.top];        //栈顶元素先出栈
    return true; 
} 
  • S.data[S.top]=x;
    S.top=S.top+1;
    可以等价为: S.data[S.top++]=x; //入栈操作
  • S.top=S.top-1;
    x=S.data[S.top];
    可以等价为:x=S.data[--S.top];
  • 以上创、增、删、查时间复杂度均为:O(1)

7.共享栈

#define MaxSize 10
typedef struct{             //定义栈中元素的最大个数 
    ElemType data[MaxSize]; //静态数组存放栈中元素 
    int top0;               //0号栈顶指针 
    int top1;               //1号栈顶指针 
}SqStack;
​
//初始化栈
void InitStack(ShStack &S){
    S.top0=-1;              //初始化栈顶指针 
    S.top1=MaxSize;
} 
​
//栈满的条件
top0+1==top1; 

2.png

顺序栈与共享栈