1 栈的概念

  • 栈:限定仅在表尾进行插入和删除操作的线性表,后进先出的线性表,简称LIFO结构
  • 栈顶:表尾,允许插入和删除的一端
  • 栈底:表头,不允许插入和删除的一端
  • 空栈:不含任何数据元素的栈

2 栈的顺序存储结构

(1) 结构代码

typedef int SElemType
typedef struct
{
    SElemType data[MAXSIZE];
    int top;
}SqStack;

(2) 属性

clipboard.png

(3) 操作

A 插入push:进栈

Status Push(SqStack *S,SElemType e)
{
    if(S->top==MAXSIZE-1){ //栈满    
        return ERROR;
    }
    S->top++; //栈顶指针增加
    S->data[S->top]=e; //将新插入元素赋值给栈顶空间
    return OK;
}

B 删除pop:出栈

Status Pop(SqStack *S,SElemType *e)
{
    if(S->top==-1){
        return ERROR;
    }
    *e=S->data[S->top]; //将要删除的栈顶元素赋值给e
    S->top--; //栈顶指针减一
    return OK;
}

C 进栈出栈有多种情况,只要保证是栈顶元素出栈就可以。

3 两栈共享空间

(1) 定义

clipboard.png

一个栈增加,一个栈缩短,当top1+top2==top2时栈满。

(2) 结构代码

typedef struck
{
    SElemType data[MAXSIZE];
    int top1;
    int top2;
}SqDoubleStack;

(3) 操作

A 插入push:进栈

Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
{
    if(S->top1+1==S->top2){ //栈已满,不能再push新元素了
        return ERROR;
    }
    if(stackNumber==1){ //栈 1 有元素进栈
        S->data[++S->top1]=e; //若是栈1则先top1+1后给数组元素赋值
    }
    else if(stackNumber==2){ //栈2有元素进栈
        S->data[--S->top2]=e; //若是栈2则先top2-1后给数组元素赋值
    }
    return OK;
}

B 删除pop:出栈

Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{
    if(stackNumber==1){
        if(S->top1==-1){
            return ERROR; //说明栈1已经是空栈,溢出
        }
        *e=S->data[S->top1--]; //将栈1的栈顶元素出栈 
    }
    else if(stackNumber==2){
        if(S->top2==MAXSIZE){
            return ERROR; //说明栈2已经是空栈,溢出
        }
        *e=S->data[S->top2++]; //将栈 2 的栈顶元素出栈 
    }
    return OK;
}

4 栈的链式存储结构

(1) 结构代码

typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

(2) 操作

A 插入push:进栈

Status Push(LinkStack *S,SElemType e)
{
    LinkStackPtr p=(LinkStackPtr)malloc(sizeof(StackNode));
    p->data=e;
    p->next=S->top; //把当前的栈顶元素赋值给新结点的直接后继
    S->top=p; //将新的结点s赋值给栈顶指针
    S->count++;
    return OK;
}

B 删除pop:出栈

Status Pop(LinkStack *S,SElemType *e)
{
    LinkStackPtr p;
    if(StackEmpty(*S)){
        return ERROR;
    } 
    *e=S->top->data;
    p=S->top; //将栈顶结点赋值给p
    S->top=S->top->next; //使得栈顶指针下移一位,指向后一结点
    free(p); //释放结点p
    S->count--;
    return OK;
}

冯天祥
19 声望10 粉丝

ZUST小白一只