顺序栈定义

typedef struct
{
    int data[MAX]; // 存放栈中元素
    int top; //  栈顶指针
} SqStack; //顺序栈类型定义

顺序栈示意图如下:

clipboard.png

链栈结点定义

typedef struct LNode
{
    int data; //  数据项
    struct LNode *next; //  指针域
}LNode; //链栈类型定义

链栈就是采用链表来存储栈。这里用带头结点的单链表来作为存储体,示意图如下:

clipboard.png

顺序队列的定义

typedef struct
{
    int data[MaxSize];
    int front; //队首指针
    int rear;//队尾指针
}SqQueue;//顺序队类型定义

链队的定义

队结点类型定义

typedef struct QNode
{
    int data; //数据域
    struct QNode *next; //指针域
}QNode; //结点类型定义

链队类型定义

typedef struct
{
QNode *front;//队头指针
QNode *rear;//队尾指针
}LiQueue;//链队类型定义

链队示意图如下:

clipboard.png

顺序栈的基本算法操作

顺序栈的要素

对于顺序栈st,一共有4个要素,包括两个特殊状态,两个操作。

(1)两状态:
①栈空状态st.top==-1(有的书上规定st.top==0为栈空条件,这样会浪费一个元素大小的空间,本书统一规定栈空状态为st.top==-1。)

②栈满状态st.top==MAX-1(MAX为栈中最大元素个数,则MAX-1为栈满时栈顶元素在数组中的位置,因为数组下标从0号开始。本书规定栈顶指针top为-1
时栈空,即top==0的数组位置也可以存有数据元素,这与之前顺序表中规定
0号数组位置不存数据元素是不同的)

(2)两操作:
①元素x进栈操作st.top++;st.data[st.top]=x;(既然规定了top为-1时栈为空,则元素进栈操作必须是先移动指针,再进入元素,因为数组下表不存在-1。在其他书中因有不同规定,会有先元素进栈再栈顶指针加1的进栈操作,其实本质一样)

②元素x出栈操作x=st.data[st.top];st.top--;(进栈操作次序决定了出栈操作次序,为什么这样说呢,如果进栈操作是先变动栈顶指针,再存入元素,则出栈操作必须为先取出元素,再变动指针。如果在上述进栈操作不变的情况下先变动指针,再取出元素,则栈顶元素丢失,取出的是栈顶下边的元素。)

初始化栈的算法

初始化一个栈只需将栈顶指针置为-1即可。算法如下:

void initStack(Sqstack &st)//初始化栈
{
    st.top=-1; //只需将栈顶指针设置为-1
。
}

判断栈空的算法

栈st为空的时候返回1,否则返回0。对应算法如下:

int StackEmpty(SqStack st)
{
    if (st.top==-1)
        return 1;
    else
        return 0;
}

进栈算法

int Push(SqStack &st,int x)
{
    if(st.top==MAX-1) //这里要注意,栈满不能进栈。
        return 0;
    st.top++; //先移动指针,再进栈。
    st.data[st.top]=x;
    return 1;
}

出栈算法

int Pop(SqStack &st,int &x)
{
    if(st.top==-1) //注意,如果栈空则不能出栈
    return 0;
    x=st.data[st.top]; //先取出元素,再移动指针
    st.top--;
    return 1;
}

元素x 出栈:

x=stack[top--]; 

kidsamong
2.8k 声望138 粉丝

进击的程序猿