数据结构笔记(一)——线性表(栈)

栈的定义:栈(stack)是限定仅在表尾进行插入和删除的线性表

栈的插入操作,也叫入栈、压栈、进栈;

栈的删除操作,也叫出栈、弹栈。

首先我们来看栈的抽象数据类型

ADT 栈(stack)
Data
    同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
    Initstack(*s):初始化操作,建立一个空栈。
    DestroyStack(*s):若栈存在,则销毁它。
    Clearstack(*s):清空栈。
    StackEmpty(s):若栈为空,返回ture,否则返回false。
    GetTop(s,*e):若栈s存在且非空,用e返回s的栈顶元素。
    Push(*s,e):若栈s存在,插入新元素e到栈s中并成为栈顶元素
    Pop(*s,*e):删除栈s中栈顶元素,并用e返回其值。
    StackLength(s):返回栈s的元素个数。
endADT
    

栈的结构定义:

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

栈的顺序存储结构——进栈操作

//插入元素e为新的栈顶元素
Status Push(SqStack *s,SElemType e)
{
    if(S->top == MAXSIZE - 1)
    {
        return ERROR;
    }
    S->top++;                    //栈顶元素加1.
    S->data[S->top]=e;           //将新插入元素赋值给栈顶空间
    return OK;
}
//若栈不空,则删除s的栈顶元素,用e返回其值
Status Pop(SqStack *s,SElemtype *e)
{
    if(s->top == -1)
        return ERROR;
    *e=s->data[s->top]
    s->top--;
    return OK;
}
//两栈共享空间结构
typedef struct
{
    SElemType data[MAXSIZE];
    int top1;
    int top2;
}SqDoubleStack;

//插入元素e为新的栈顶元素
Status Pus(SqDoubleStack *s,SElemType e,int stackNumber)
{
    if(s->top1+1 == s->top2)
        return ERROR;
    if(stackNumber == 1)
        s->data[++s->top1]=e;
    else if(stackNumber == 2)
        s->data[--s->top2]=e;
    return OK;
}

//若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqDoubleStack *s,SElemType *e,int stackNumber)
{
    if(stackNumber == 1)
    {
        if(s->top1 == -1)
            return ERROR;
        *e=s->data[s->top1--];
    }
    else if(stackNumber==2)
    {
        if(s->top2 == MAXSIZE)
            return ERROR;
        *e=s->data[s->top2++];
    
    }
    return OK;
}

栈的链式存储结构:

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

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;
//插入元素e为新的栈顶元素
Status Push(LinkStack *s,SElemType e)
{
    LinkStackPtr d=(LinkStackPtr)malloc(sizeof(StackNode));
    d-data=e;
    d->next=s->top;
    s->top=d;
    s->count++;
    return OK;
}
//栈的链式存储结构——出栈操作
//操作结果:若栈不空,删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(LinkStack *s,SElemType *e)
{
    LinkStackPtr p;
    if(StackEmpty(*s))
        return ERROR;
    *e=s->top->data;
    p=s->top;
    s->top=s->top->next;
    free(p);
    s->count--;
    return OK;
}

猜你喜欢

转载自blog.csdn.net/yizhixiaoma/article/details/88591530