链栈的表示和实现


链栈的表示:链栈是运算受限的单链表,只能在链表头部进行操作。(用链式存储,存储的栈)

类型定义:

// 栈的结点类型
typedef struct StackNode{
    // 数据域,用来存放栈中元素
    // 所以它的类型是栈里元素的类型
    SElemType data;
    // 指针域是指向下一个元素的
    // 所以它指向的类型仍然是这种(StackNode)结构类型
    // 所以这样定义这个指针,即规定它要指向什么样的结构类型才合法
    struct StackNode *next;
    // 再用这样一个类型定义一个指向这样结点的指针类型,
    // 也就是*LinkStack
} StackNode, *LinkStack;

// 用大写字母 S 来表示Stack 栈
LinkStack S;

 

 

栈的存储:(第一个元素就是栈底,最后一个元素就是栈顶,S指向栈顶)

注意!!!链栈中指针的方向和单链表的指针方向是不同的,

单链表是第一个元素指向第二个元素,第二个指向第三个

链栈里的指向是反过来的,由最后一个指向倒数第二个,以此类推

 

① 链栈的头指针就是栈顶

② 不需要头结点

③ 基本不存在栈满的情况(只要内存有空间,不会栈满)

④ 空栈相当于头指针指向空

⑤ 插入和删除仅在栈顶处执行

 

链栈的初始化

void InitStack(LinkStack &S){
    // 构造一个空栈,栈顶指针置为空
    // S 是头指针
    S = NULL;
    return OK;
}

 

 

【补充算法】判断链栈是否为空

就是判断头指针是否为空,如果为空就返回TRUE,否则返回FALSE

Status StackEmpty(LinkStack S){
    if(S == NULL){
        return TRUE;
    }else{
        return FALSE;
    }
}

 

 

链栈的入栈

S指向栈顶元素,S为头指针

① P->next = S // 让P所指向的元素指向S所指向的元素

② S = P // 修改头指针指向位置

Status Push(LinkStack &S, SElemType e){
    p = new StackNode; // 生成新节点P
    p -> data = e; // 将新节点数据域设置为 e
    p -> next = S; // 将新节点插入栈顶
    S = p; // 修改栈顶指针
    return OK;
}

 

 

链栈的出栈

① 让一个指针 P 指向 S 所指向结点

② 让指针 S 指向下一个结点

③ 销毁 指针P 所指向结点

Status Pop(LinkStack &S, SElemType &e){
    if(S == NULL){
        return ERROR;
    }
    e = S -> data;
    p = S;
    S = S -> next;
    delete p;
    return OK;
}

 

 

取栈顶元素

 

 

SElemType GetTop(LinkStack S){
    if(S!=NULL){
        return S->data;
    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM