链栈的基本操作

  • 定义
  • 结构体
  • 链栈的基本操作

    1. 压栈
    2. 读栈
    3. 弹栈
    4. 求栈的长度

1.定义

1.1栈

栈(stack)是一种特殊的线性表.栈是限定结点插入和删除只能在同一端进行的线性表.

栈犹如一个一端开口一端封闭的容器.可插入和删除的一端称为栈顶,另一端称为栈底.

”栈顶指针”:指示最后插入栈中的结点位置,处于栈顶位置的结点称为栈顶结点.”栈底指针”:指示栈底位置,它始终指向最先插入的结点的下面位置.

不含任何结点的栈称为”空栈”.栈为空时,栈顶指针和栈底指针重合.

栈的插入形象地称为”压栈”.删除称为弹栈.

栈的重要特点,最后压入的结点最先弹出,最先压入的结点只能最后弹出.因此,栈又称为后进先出表,或称LIFO表(Last In First Out).

1.2链栈

链存储结构存储的栈称为链栈.链栈的结点由结点数据和next指针构成.用头指针指向链栈的栈顶指针,其余结点通过next指针链接起来;栈底结点的next指针值为空.因为插入和删除总店链的头部进行,所以头指针也是栈顶指针;栈顶指针唯一确定一个链栈.因为链栈没有容量的限制,所以在可用的存储空间范围内一般不会出现上溢问题.

2.结构体

在StackListCs.c

# define DT char
typedef struct stack{
    DT data;
    struct stack *next;

}STACKNODE;

data为结点数据域,next为结点指针域.
根据结点类型定义一个链栈
STACKNODE *top;
top为栈名,链头指针,也是栈顶指针.创建新栈时top的值为空.

3.链表操作

3.1压栈

在StackListControl.h写出方法声明

/*
 压栈
 */
STACKNODE * pussListStack(STACKNODE *LS,char x);

在StackListControl.c中实现此方法

#include "StackListControl.h"


/*
 压栈
 */
STACKNODE * pussListStack(STACKNODE *LS,char x){
    //1.创建一个新的结点
    STACKNODE *q;
    q=(STACKNODE *)malloc(sizeof(STACKNODE));

    //2.设置data和指针域指针值
    q->data=x;
    q->next=LS;
    //3.将栈顶指针指向新插入结点
    LS=q;
    return LS;
}

3.2读栈

在StackListControl.h写出方法声明


/*
 读栈
 */
DT  getListStack(STACKNODE *LS);

在StackListControl.c中实现此方法

DT  getListStack(STACKNODE *LS){
    DT  t;
    //1.查看LS是否为NULL
    if(LS==NULL){
        printf("stack empty!\n");
    }else{
        //2.读取栈顶数据
        t=LS->data;
    }
    return t;

}

3.3弹栈

在StackListControl.h写出方法声明


/*
 弹栈
 */
STACKNODE *popListStack(STACKNODE *LS);

在StackListControl.c中实现此方法


STACKNODE *popListStack(STACKNODE *LS){

    STACKNODE *q;
    //1.先判断栈是否为NULL
    if(LS==NULL){
        printf("Empty Stack!\n");
    }else{
        //2.先存储栈顶指针
        q=LS;
        //3.栈顶指针向下移动一位
        LS=q->next;
    }

    return LS;
}

3.4求栈长度

在StackListControl.h写出方法声明

/*
 求栈的长度
 */

int  lengthListStack(STACKNODE *LS);

在StackListControl.c中实现此方法



int  lengthListStack(STACKNODE *LS){
    int len=0;
    if(LS==NULL){
        return 0;
    }else{
        do{
            len++;
            LS=LS->next;
        }while(LS!=NULL) ;
    }

    return len;
}

在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断


  #include "StackListControl.h"
  int main(int argc, const char * argv[]) {
    //1.链栈-->压栈
    printf("压栈\n");
    STACKNODE *LS;
    LS=pussListStack(LS, 'a');
    LS=pussListStack(LS, 'b');
    LS=pussListStack(LS, 'c');


    //求栈长度
    printf("求栈长度\n");
    int  len=lengthListStack(LS);
    printf("len=%d\n",len);


    //读栈
    printf("读栈\n");
    DT  t=getListStack(LS);
    printf("t=%c\n",t);


    //弹栈
    printf("弹栈\n");
    LS=popListStack(LS);


    //求栈长度
    printf("求栈长度\n");
    len=lengthListStack(LS);
    printf("len=%d\n",len);

    return 0;

}

打印结果:

压栈
求栈长度
len=3
读栈
t=c
弹栈
求栈长度
len=2


这是链栈基本操作,请大家指点,有好的建议请大家指出,有好的书籍,还往大家推荐!


源码下载

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐